Digits of Factorial --计算n!在k进制下位数

思路:

利用log求位数。。。以前做过一个比较a的b次方和c的d次方的大小的题,就是利用log统一底数在比较。

f[n]在k进制下的位数,即logk(f[n])=log10(f[n])/log10[k],打个1e6的表,表示10进制下f[n]的位数,即log10(f[n]),然后结果向上取整就行了,当n=0的时候加个特判。

ceil()函数 #include<cmath>,或<cmath.h> 使用时注意该函数的返回类型

用 法: double ceil(double x);
功 能: 返回大于或者等于指定表达式的最小整数
头文件:math.h
说明:
float ceil ( float value )
返回不小于 value 的下一个整数,value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。

#include <iostream>
#include<cmath>
using namespace std;
int t,n,top;
double a[1000006],k;
int main()
{
    cin>>t;
    a[0]=log10(1);
    for(int i=1; i<=1000000; i++)
        a[i]=a[i-1]+log10(i);
    while(t--)
    {

        cin>>n>>k;
        cout<<"Case "<<++top<<": ";
        if(n==0)
        {
            cout<<1<<endl;
            continue;
        }
        int sum=ceil(a[n]/log10(k));
        cout<<sum<<endl;
    }
    return 0;
}

本以为巨难的一个题,没想到这么easy。。。知识面不够啊。

猜你喜欢

转载自blog.csdn.net/qq_41049928/article/details/83187077