1. 程式人生 > >又是二分(避免死迴圈)

又是二分(避免死迴圈)

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型)

另外這個題還有就是得知道階乘的數的末尾零的個數得數的計算方法,這樣這個題就沒有什麼問題了