⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 求n!(可求到n=20000时长31秒).cpp

📁 西电内部用的高精度库,原是保密的!!!我奉献了出来
💻 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 + -