我的这个大数阶乘是完全基于模拟手动运算的,速度略慢,其中的核心函数是之前我写的一个大数乘法算法
#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位