题目描述
输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2
输入描述
输入为一行,n(1 ≤ n ≤ 1000)
输出描述
输出一个整数,即题目所求
示例
Input
10
Output
2
思路:
先用递归写一个函数求阶乘。
利用while循环给结果除以10取余,若余数为0,说明末尾是0,循环变量自增,当余数不为0时,跳出循环,输出循环变量
学长说难点是如何解决越界问题。。限制输入数字的大小。。就不会越界了。。但是就算这样,首先我要知道多少的阶乘会超出界限。好伐,其实我没想明白怎么解决。
但是由于阶乘是针对正整数的,所以可以把n和n!都定义成无符号类型,这样他的范围也就相对大了。
代码:
#include<stdio.h>
long fac(unsigned n){
if (n == 0 || n == 1){
return 1;
}
else{
return (n * fac(n - 1));
}
}
int main(){
int i = -1;
int flag=0;
unsigned n,facn;
scanf("%d",&n);
facn = fac(n);
while(flag == 0){
i++;
flag = facn%10;
facn = facn/10;
}
printf("%d",i);
}
Q&A
Q:为什么i从-1开始?
A:如测试用例,阶乘结果有两个0,首次进入循环需要让余数初值为0,除掉第一个尾数0,循环变量增加1,余数为0;除掉第二个尾数值循环变量增加1,余数仍为0,还可以第三次进入循环,此时余数不为0,跳出循环。所以循环变量从-1开始,去掉进入循环时初始化余数的0的影响。
Q:对越界的解决?
A:待解决。
运行结果
运行结果








网友评论