lightOJ 1138 Trailing Zeroes (III)

来源:互联网 发布:网络域名申请 编辑:程序博客网 时间:2024/06/06 01:02

题目链接:http://lightoj.com/volume_showproblem.php?problem=1138

题意:给你一个数n,让你求最小的m,使得m的阶乘有n个0

思路:n阶乘的0,与n中包含的5的个数有关,但是因为n的范围太大,需要先进行打表,在进行折半查找,同时还要注意开的数组的大小,不要
超过内存


代码:

#include<stdio.h>const int MAXN=8000000;int a[MAXN+5];void Init(){//预处理    a[0]=0;    for(int i=50;i<=400000000;i+=50){        int t=i;        int k=0;        while(t){            k+=t/5;            t/=5;        }        a[i/50]=k;    }}int binary_search(int key,int n)//折半查找{    int low,high,mid,count=0;    low=0;    high=n;    while(low<=high)    {        count++;        mid=(low+high)/2;        if(key>a[mid] && key<a[mid+1]) return mid;        else if(key<a[mid]) high=mid-1;        else if(key>a[mid]) low=mid+1;        else if(key==a[mid]) return mid;        }}int main(){    int T,kase=0;    Init();    scanf("%d",&T);    while(T--){        int n;        int flag=1;        scanf("%d",&n);        int t=binary_search(n,MAXN);        for(int i=t*50;i<(t+1)*50;i+=5){            int k=i;            int ans=0;            while(k){                ans+=k/5;                k/=5;            }            if(ans==n){                printf("Case %d: %d\n",++kase,i);                flag=0;                break;            }        }        if(flag) printf("Case %d: impossible\n",++kase);    }    return 0;}



0 0
原创粉丝点击