《编程思维与实践》1061.计算n!右端0的个数(II)
题目
思路
可以用大整数的乘法来处理,不过有些题目可以用数论的方法得到更方便的做法,
以本题为例:
注意到 10 = 2 ⋅ 5 10=2\cdot 5 10=2⋅5 , 所以只需要将阶乘的每一项分解成2和5的乘积形式即可,
同时由于每出现一个5,必然会出现一个2,所以只需要统计出现5的个数即可.
注意的点:
有的数可能可以分解出多个5,如 50 = 5 ⋅ 5 ⋅ 2 50=5\cdot5\cdot2 50=5⋅5⋅2 , 所以需要不断除以5判断是否还能整除.
代码
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
for(int t=0;t<T;t++)
{
int N;
scanf("%d",&N);
int num_five=0; //分解因数5的个数
for(int i=1;i<=N;i++)
{
int temp=i;
while(temp%5==0) //不断分解出5
{
num_five++;
temp/=5;
}
}
printf("case #%d:\n",t);
printf("%d\n",num_five);
}
return 0;
}