uva 10061: How many zero's and how many digits?

对于这么大的数字,要想知道他有几位数,末尾有多少个零,很明显不能按常规的方法来做。


一、求末尾有几个零的代码:

int ZeroNum()  
{  
    memset(factor_count,0,sizeof(factor_count));  
    for(int i=2; i<=N; i++)  
    { 
        int tmp=i;  
        for(int j=2; j<=tmp && j<=B; j++) 
        {  
            while(tmp%j==0)  
            {  
                factor_count[j]++;  
                tmp /= j;  
            }  
        }  
    }  
    int nZero=0;  
    while(1)  
    {
        int tmp=B;  
        for(int i=2; i<=tmp; i++)  
        {  
            while(tmp%i==0 && factor_count[i]>0)  
            {  
                factor_count[i]--;  
                tmp /= i;  
            }  
        }  
        if(tmp==1) nZero++;  
        else break;  
    }  
    return nZero;  
}  

思路就是:先找出前面所乘数字中所有小于B的因子factor以及其个数 factor[i];

   然后,计数这所有的因子可以 将B整除到1 的次数。

————这就是末尾零的个数。


二、求总共有多少位的代码:

int DigitNum()  
{  
    double sum=0;  
    for(int i=2; i<=N; i++)  
        sum += log10(double(i));  
    sum /= log10(double(B));  
    return floor(sum+1e-9) + 1;  
  
}

思路是这样的:

B进制下m位数所能表示的最大值在10进制下,为B^m-1;

若设总位数为m,则有公式:B^(m-1)<=N!<B^m;

我们会发现N!因为太大是表示不出来的。但是,公式是需要变形的!

就有(m-1)*log10(B)<=log10(N!)<=m*log10(B);

还有一个重要的关系式:log10(1*2*3*...*N)=log10(1)+log10(2)+log10(3)+..+log10(N);!!!

就有了求位数m的办法。




你可能感兴趣的:(c,uva)