1091: N!的位数 [数学]
时间限制: 1 Sec 内存限制: 128 MB题目描述
我们知道n!=n*(n-1)*(n-2)*…*2*1。
那么给定一个n,n!是几位数呢。
更困难的,n!的k进制数有多少位呢。
输入
第一行是一个数T(1≤T≤50000),代表T组测试数据。
每一组测试数据占一行,有两个整数n(0 ≤ n ≤ 10^6),k(2≤k≤1000)。
输出
对于每组测试数据,输出n!k进制数的位数。
样例输入
2
3 10
3 2
样例输出
1
3
N!=1*2*3*4*5*............*N;
lgN!=lg1+lg2+lg3+lg4+lg5+....................+lgN;
(int)(a[n]/log(k))+1 k进制的位数;
#include<math.h>
#include<string.h>
double a[1000000+10];
int main()
{
double p=0;
memset(a,0,sizeof(a));
for(int i=1;i<=1000000+10;i++)
{
p+=log(i);
a[i]=p;
}
int t,n,k;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&k);
printf("%d\n",(int)(a[n]/log(k))+1);
}
return 0;
}
logN!= ( log( 2 * pi ) + logN ) / 2 + N * ( logN - loge ) ;
斯特林公式可以用来估算某数的大小结合log可以估算某数的位数,或者可以估算某数的阶乘是另一个数的倍数。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const double PI=acos(-1.0);
const double e=exp(1.0);
int main()
{
int t;
double n,k;
scanf("%d",&t);
while(t--)
{
scanf("%lf %lf",&n,&k);
if(n==0 || n==1)
printf("1\n");
else if(k==2 && n==2)
printf("2\n");
else
printf("%.0lf\n",floor((log(sqrt(2*1.0*PI*n))+n*log(n*1.0/e))/(log(k)))+1);
}
return 0;
}