唉,先说下感受,其实发现现在很多都是看着别人的博客想思路了,基本上碰到一个题就不会做,碰到一个题就不会做,只有看半天别人的博客才能明白怎么做了,初学阶段比葫芦画瓢,但有时候感觉一直找葫芦搞得自己很惭愧,但不看又只能干瞪眼,总之走一步看一步吧,这东西还是得多练,毕竟现在每天接触的都是一些新的东西
You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the trail.
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case contains an integer Q (1 ≤ Q ≤ 108) in a line.
For each case, print the case number and N. If no solution is found then print 'impossible'.
3
1
2
5
Case 1: 5
Case 2: 10
Case 3: impossible
这道题题的大致意思就是说,给你一个数q,q代表的是某个数N的阶乘的末尾0的个数,最后让你找出这个N,当然这道题因为数据量很大,所以一个一个的找肯定是实现不了的,所以用到了二分思想,当然今天的专题就是二分,话不多说,代码奉上,代码中有详细的解释:
#include<stdio.h>
long long cal(long long x)//这里是一个找出N!末尾有几个0的函数,当成模板记住就好了,原理的话在数学小知识里面有
{
long long p=0;
while(x)
{
p=p+x/5;
x=x/5;
}
return p;
}
int main()
{
int n;
scanf("%d",&n);
int t=n;
while(n--)
{
long long q;
long long l=0,r=500000000;//二分思想的话得有边界值,这个至目前算是最大的那个值了,再大就WA了
long long ans;//储存符合条件的N;
scanf("%lld",&q);
while(l<=r)//二分经典模板,改下条件直接套用就好了
{
long long mid=(r+l)/2;
if(cal(mid)>=q)
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
if(cal(ans)!=q)//如果最后得出来的那个N!最后末尾0的个数和给的个数不等意味着这个数不存在,注意的是这里是cal(ans)和q比较的,因为ans是N,而cal(ans)才是0的个数
printf("Case %d: impossible\n",t-n);
else
printf("Case %d: %d\n",t-n,ans);//输出的时候输出所得的N就行了
}
return 0;
}