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

来源:互联网 发布:360云盘程序员 编辑:程序博客网 时间:2024/05/18 00:40

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




最大支持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


0 0
原创粉丝点击