📄 求n!(可求到n=20000时长31秒).cpp
字号:
//#include<iostream>
//#include<cstdlib>
//#include<ctime>
//using namespace std;
//const int mxdgs=150000;
//int main()
//{
// int n;
// while(cin>>n)
// {
// clock_t start=clock();
// int dgs[mxdgs];
// dgs[0]=1;
// for(int i=1;i<mxdgs;i++)dgs[i]=0;
// for(int k=2;k<=n;k++)
// {
// int cary=0;
// for(int j=0;j<mxdgs;j++)
// {
// dgs[j]=k*dgs[j]+cary;
// cary=dgs[j]/10;
// dgs[j]-=10*cary;
// }
// }
// int count =mxdgs-1;
// while(!dgs[count])count--;
// int numdgofn=0;
// int m=n;
// while(m)
// {
// m/=10;
// numdgofn++;
// }
// if(mxdgs-count<numdgofn+1)
// {
// cout<<"数位太长"<<endl;
// exit(1);
// }
// cout<<n<<"!.there are: "<<count<<"位"<<endl;
// for(int i=count;i>=0;i--)
// cout<<dgs[i];
// cout<<endl;
// clock_t end=clock();
// cout<<(double)(end-start)/CLOCKS_PER_SEC<<endl;
// }
// return 0;
//}
/*前者交后者慢且速度慢在N〈=5000时,后者时长在一秒内,前者不行*/
#include<iostream>
#include<iomanip>
#include<ctime>
#include<cmath>
#include<cstdlib>
using namespace std;
int getbitnum(int n);
char* init(int size);
void calc(char *a,int n);
void display(char *a,int size);
int main()
{
int n;
while(cin>>n){
clock_t start=clock();
int size=getbitnum(n);
char *pa=init(size);
calc(pa,n);
display(pa,size);
delete[]pa;
clock_t end=clock();
cout<<(double)(end-start)/CLOCKS_PER_SEC<<endl;
}
return 0;
}
int getbitnum(int n)
{
double sum=1.0;
for(int i=1;i<=n;i++)
sum+=log10(i*1.0);
return sum;
}
char *init(int size)
{
char *pa=new char[size];
if(!pa)
{
cout<<"too large factor of"<<size<<endl;
exit(1);
}
pa[0]=1;
for(int i=1;i<size;i++)
pa[i]=0;
return pa;
}
void calc(char *a,int n)
{
double bitcount=1;
int begin=0;
for(int i=2;i<=n;i++)
{
long and=0;
bitcount+=log10(i*1.0);
//cout<<log10(i*1.0)<<endl;
if(a[begin]==0)
begin++;
for(int j=begin;j<int (bitcount);j++)
{
and+=i*a[j];
a[j]=char(and%10);
and/=10;
}
}
}
void display(char *a,int size)
{
int bit=0;
for(int i=size-1;i>=0;i--)
cout<<(int)a[i];
cout<<endl<<size<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -