大数N的阶乘

模拟+优化


先贴一个未优化过的按10进制写的:

#include 
#include 
#include 
#include 
#include 
#define LL long long
using namespace std;
const int AX = 1e6+666;
int  a[AX];
int main(){
	int n;
	cin>>n;
	int len = 1;
	a[1] = 1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=len;j++){
			a[j]*=i;
		}
		for(int j=1;j<=len;j++){
			if(a[j] < 10 ) continue;
			
			int pos = j;
			while(pos <= len){

				if(a[len] > 9) len++;
				a[pos+1] += a[pos]/10;
				a[pos] = a[pos]%10;
				pos++;
			}

		}
	}
	for(int i=len;i>=1;i--){
		cout<


下面的是按照10000进制(更省时)写的:

#include 
#include 
#include 
#include 
#define LL long long
using namespace std;
const int mod = 1e4;          //mod进制
const int AX = 1e6+666;
int  a[AX];
int main(){
	int n;
	cin>>n;
	int len = 1;
	a[1] = 1;
	for(int i=2;i<=n;i++){
		LL c = 0;
		for(int j=1;j<=len;j++){
				int m = a[j]*i+c;
				c = m/mod;
				a[j] = m%mod;
				//cout<=1;i--){
		printf("%04d",a[i]);        //这里控制输出格式,如果mod设为1e5进制,则这里改为%05d
	}
	cout<


你可能感兴趣的:(暑期集训刷题算法复习(新手,),数论,大数)