题目描述
题意: 已知:N!=N*(N-1)*…21 找到最小自然数 N, 使N!末尾有连续 M个零. 例如, 5! 的结尾包含1个零.
输入
第一行输入一个整数T,表示有T组测试数据。 对于每组测试数据,输入一个整数M,表示包含M个零。(0<=M<=10^8)
输出
每组数据,输出一行满足条件的最小自然数N。 如果无解,输出“No solution”。(不含引号)
样例输入
2
1
2
样例输出
5
10
/*
题目描述
题意: 已知:N!=N*(N-1)*...*2*1 找到最小自然数 N, 使N!末尾有连续 M个零. 例如, 5! 的结尾包含1个零.
输入
第一行输入一个整数T,表示有T组测试数据。 对于每组测试数据,输入一个整数M,表示包含M个零。(0<=M<=10^8)
输出
每组数据,输出一行满足条件的最小自然数N。 如果无解,输出“No solution”。(不含引号)
样例输入
2
1
2
样例输出
5
10
*/
/**
思路:发现,如果结尾产生0,必有5的倍数
例:50!
5,10,15,20,25,30,35,40,45,50
除以5(有10个5,即就是有10个0)后
1,2,3,4,5,6,7,8,9,10 (再除以5,有2个0)
0,0,0,0,1,0,0,0,0,2
总结:f(50) = 10 + f(10)
f(10) = 2 + f(2)
f(2) = 0
得到以下推导公式:
f(n) = n/5 + f(n/5)
*/
#include<stdio.h>
int main(void){
int n;
printf("请输入测试数据组数:");
scanf("%d",&n);
int arr[n]; //定义测试数据数组
int i;
for(i=0;i<n;i++){ //输入数据
scanf("%d",&arr[i]);
}
for(i=0;i<n;i++){
int N = findN(arr[i]);
if(N==-1){
printf("No solution\n");
}else{
printf("%d\n",N);
}
}
return 0;
}
/**
查找含有M个0的N!
*/
int findN(int M){
int i;
int count=0;//计数器
for(i=1;;i++){//从1开始遍历查找每一个阶乘 直到匹配为止
count = getNum(i);
if(count==M){
return i;
}else if(M < 0 || count > M){
return -1; //-1表示无解
}
}
}
/**
获取N阶乘 中0的个数
*/
int getNum(int N){
if(N<5){
return 0;
}
return N/5+getNum(N/5);
}