【算法精练】高次方数的尾数/阶乘尾数零的个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41035588/article/details/83310497

高次方数的尾数

**要求:**求133的133次方的最后三位数。利用C/C++程序进行设计。

算法设计:由于计算机所能表示的整数范围有限,直接乘的方法显然是不可能得到正确的结果。但事实上,题目只要求保留后三位,完全没有必要求出完整结果。因此:通过研究乘法的规律可以发现,乘积的后三位的值只与乘数与被乘数的后三位有关,与他们的高位无关。利用这一规律,可以大大简化程序。

源代码及注释

#include <stdio.h>
#include <windows.h>
int main()
{
	int x = 0;
	int y = 0;
	int i = 0;
	int last_num = 1;
	printf("Please enter x * y\n");
	scanf("%d %d",&x,&y);
	for(i = 0;i < y;i++)//y个x相乘,循环y次刚好乘完
	{
		last_num = last_num * x % 1000;//mod模上1000,即取后三位
	}
	printf("The last 3 digits of %d * %d: %d\n",x,y,last_num);
	system("pause");
	return 0;
}

阶乘尾数零的个数

要求:100!的末尾有多少个零?

算法设计:先求出100!的值,然后数一下末尾的零的个数。但问题与上题一样,计算机所能表示的整数范围有限,这是不可能的。因此:就必须从数学上分析在100!的末尾产生零的条件。即:一个整数若含有一个因子5,则必然会在求100!时产生一个零。因此问题转换为求1到100之间包含了因数5的个数。若整数N能被25整除,则N包含2个因子5,;若整数N能被5整除,则包含1个因子5。

源代码及注释:

#include <stdio.h>
#include <Windows.h>
int main()
{
	int a = 0;
	int count = 0;
	for(a = 5;a <= 100;a += 5) //循坏从5开始,以5的倍数为步长
	{
		count++;      //5的倍数直接+1
		if(!(a % 25))//能被25整除在+1,即+2
			count++;
	}
	printf("The number of 0 in the end of 100 is: %d\n",count);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41035588/article/details/83310497