C/C++编程小练习 大数阶乘

我的这个大数阶乘是完全基于模拟手动运算的,速度略慢,其中的核心函数是之前我写的一个大数乘法算法

#include 
  
  
   
   
#include 
   
   
    
    
using namespace std;
void reverse_str(char *a,int size){
	for(int i=0;i
    
    
     
     >a;
	cin>>b;
	int a_len=strlen(a);
	int b_len=strlen(b);
	reverse_str(a,a_len);
	reverse_str(b,b_len);
	for(int i=0;i
     
     
      
      9){
				c[k+1]+=(c[k]/10);//这里的两个赋值不能写颠倒了,要注意c[k]值的先后变化.
				c[k]=c[k]%10;
			}
		}
	}

	int j;
	for(j=a_len+b_len;j>0;--j){
		if(c[j]!=0){
			break;
		}
	}
	for(int i=j;i>=0;--i){
		cout<<(int)c[i];
	}
	cout<
      
      
     
     
    
    
   
   
  
  




最大支持4万位的number输出(10000!是35660位,也可进一步增加),下面是正式代码

#include <iostream>
#include <cstring>
using namespace std;
void reverse_str(char *a,int size){
	for(int i=0;i<size/2;++i){
		char t=a[i];
		a[i]=a[size-i-1];
		a[size-i-1]=t;
	}
}

void large_mul(char a[],char b[],char c[]){
	char a_t[20]={0};//注意这里的数组可以开得很小
	char b_t[40000]={0};
	char c_t[40000]={0};
	strcpy(a_t,a);
	strcpy(b_t,b);
	int a_len=strlen(a_t);
	int b_len=strlen(b_t);
	
	reverse_str(b_t,b_len);
	for(int i=0;i<b_len;++i){
		for(int j=0;j<a_len;++j){
			int k=i+j;
			c_t[k]+=(a_t[j]-'0')*(b_t[i]-'0');
			if(c_t[k]>9){
				c_t[k+1]+=(c_t[k]/10);
				c_t[k]=c_t[k]%10;
			}
		}
	}

	int j;
	for(j=a_len+b_len;j>0;--j){
		if(c_t[j]!=0){
			break;
		}
	}
	c_t[j+1]=0;
	for(int i=j;i>=0;--i){
		c_t[i]=c_t[i]+'0';
	}
	reverse_str(c_t,strlen(c_t));
	strcpy(c,c_t);
}

void my_itoa(int i,char ti[]){//此处不反转了,因为后面要进行大整数乘法处理,其中用到的数是反转数
	int cnt=0;
	while(i!=0){
		ti[cnt++]=i%10+'0';
		i/=10;
	}
	ti[cnt]='\0';
}

void large_num_factorial(int n){
	if(n<=20){
		unsigned long long t=1;
		for(int i=2;i<=n;++i){
			t*=i;
		}
		cout<<t<<endl;
	}else{
		char c[40000]={0};
		strcpy(c,"2432902008176640000");
		char ti[20];
		for(int i=21;i<=n;++i){
			my_itoa(i,ti);//标准库中功能没有itoa()函数,所以自己手写了一个
			large_mul(ti,c,c);
		}
		cout<<c<<endl;
	}
}


int main(){
	int n;
	cin>>n;
	large_num_factorial(n);
	return 0;
}

例如:

input:

 n=1000

output:

402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901

323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783

647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374

559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236

131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333

1861168115536158365469840467089756029009505376164758477284218896796462449451607653534081989013854424879849599533191017233555566021394503997362807

5013783761530712776192684903435262520001588853514733161170210396817592151090778801939317811419454525722386554146106289218796022383897147608850627

6862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581

7466283029555702990243241531816172104658320367869061172601587835207515162842255402651704833042261439742869330616908979684825901254583271682264580

6652676995865268227280707578139185817888965220816434834482599326604336766017699961283186078838615027946595513115655203609398818061213855860030143

56945272242063446317974605946825731037900840244324384656572450144028218852524709351906209290231364932734975655139587205596542287497740114133469627

15422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918

31102117122984590164192106888438712185564612496079872290851929681937238864261483965738229112312502418664935314397013742853192664987533721894069428

14341185201580141233448280150513996942901534830776445690990731524332782882698646027898643211390835062170950025973898635542771967428222487575867657

5234422020757363056949882508796892816275384886339690995982628095612145099487170124451646126037902930912088908694202851064018215439945715680594187

2748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753

4720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2568


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值