版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}