又是二分(避免死循环)

1138 - Trailing Zeroes (III)
Time Limit: 2 second(s)Memory Limit: 32 MB

Sample Input

Output for Sample Input

3

1

2

5

Case 1: 5

Case 2: 10

Case 3: impossible


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

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.

Output

For each case, print the case number and N. If no solution is found then print 'impossible'.

#include<cstdio>
long long f(long long q)
{
    long long sum=0;
    while( q>0)
    {
        sum+=q/5;
        q/=5;
    }
    return sum;
}


int main()
{
    int t,k=1;
    long long l,r,m,q,ans;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d",&q);
        l=1;
        r=1000000000;
        ans=0;
        while(l<r)
        {
            m=(l+r)/2;
            if(f(m)==q)
            {
                ans=m;
                r=m;
            }
            else   if(f(m)<q)


                l=m+1;
            else
                r=m-1;


        }
        if(ans)
            printf("Case %d: %I64d\n",k++,ans);
        else
            printf("Case %d: impossible\n",k++);
    }
    return 0;
}

这个题的坑有很多,在这样题目中,其实要避免死循环,是要看数的精度的,如果数的精度够,那么便不用管加1还是减1,比如定义成double型的,但是如果定义成int型的,那就要注意了,会进入死循环的,所以要加1和减1,这一点要特别注意,(在计算根的时候,主要就是定义成的double型)

另外这个题还有就是得知道阶乘的数的末尾零的个数得数的计算方法,这样这个题就没有什么问题了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值