这题想直接用之前做的一道题51Nod 1057 N的阶乘
但是超时了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int n;
static long long a[10000000];
a[0]=1;
cin>>n;
int len=1;
for(int i=2;i<=n;i++){
long long r=0;
for(int j=0;j<len;j++){
long long fz=a[j]*i+r;
a[j]=fz%100000000;
r=fz/100000000;
}
if(r!=0) a[len++]=r;
}
//printf("%lld",a[len-1]);
int sum=0;
while(a[len-1]){
sum++;
a[len-1]/=10;
}
//for(int i=len-2;i>=0;i--) printf("%08lld",a[i]);
sum+=8*(len-1);
cout<<sum;
return 0;
}
在网上看了大佬的代码
n!的长度=log10(n!)+1
这样就简单了,一个循环搞定
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define e exp(1)
using namespace std;
int main(){
int n;
cin>>n;
double sum=0;
for(int i=1;i<=n;i++) sum+=log10(i);
cout<<(int)sum+1;
return 0;
}
数据n如果过大,n!=sqrt(2*M_pi*n)*pow(n/e,n)
n!的长度=0.5*(log10(2*M_PI*n))+n*(log10(n/e))+1
其中M_PI是math库定义好的Pi可以直接使用
然后用exp(n)代表e^n
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define e exp(1)
using namespace std;
/*
n!=sqrt(2*M_pi*n)*pow(n/e,n)
*/
int main(){
int n;
cin>>n;
double sum=0.5*(log10(2*M_PI*n))+n*(log10(n/e));
cout<<(int)sum+1;
return 0;
}