大數階乘 c++

來源:互聯網
上載者:User

就是求n!

 

(一)

 

//為了明白示範,將max改為4,並以n=4為範例<br />//由最後一句可以看出b是用來儲存結果的,由高位到低位;b[max-1]為個位,b[max-2]為十位,依此類推<br />//a和b儲存的方式一樣,但是用來儲存中間結果的<br />//作者沒有使用乘法,顯然是要以加法來替代的。<br />#include "stdafx.h"<br />#include <iostream><br />#define max 1000//實際應用時,這個要改成比較大的數,如1000;那就表示能表達多達1000位的數<br />using namespace std; </p><p>void Print(int array[])//列印<br />{<br />for(int i=0;i<max;i++)<br />cout<<array[i]<<" ";<br />cout<<endl;<br />}</p><p>long NFai(long n)//求n!,作對比用<br />{<br />int res=1;<br />for(long i=2;i<=n;i++)<br />{<br />res=res*i;<br />}</p><p>return res;<br />}<br />void main()<br />{<br />int a[max],b[max];<br />int i,j,k,l=0,n; </p><p>cout <<"input a number:" <<endl;<br />n = 13; //以輸入4為範例。</p><p>//初始化a,b<br />for(i=0;i <max-1;i++)<br />{<br />a[i]=0;b[i]=0;<br />}<br />a[max-1]=1;b[max-1]=1; </p><p>for(i=1;i <=n;i++) //對於1到n每個數<br />{<br />for(j=max-1;j>=0;j--) //由低位到高位<br />{<br />for(k=1;k <i;k++) //假如i=3,那此時a就是儲存以前的結果3=1*2<br />{<br />int f=0;//表示進幾次位<br />while(1)<br />{<br />if((b[j]+a[j]-f*10) <10) //如果不夠進位<br />{<br />b[j]=b[j]+a[j]-f*10;//求本位的值<br />break;<br />}<br />else //如果夠進位<br />{<br />b[j-1]=b[j-1]+1; //高位加1<br />f++;<br />}<br />}<br />} </p><p>//cout<<"a=";<br />//Print(a);<br />//cout<<"b=";<br />//Print(b);<br />a[j]=b[j]; //將本位的值儲存到a<br />} </p><p>cout<<"數"<<i<<"處理完畢"<<endl;<br />} </p><p>while(b[l]==0)l++; //越過高位為0的部分</p><p>cout<<"結果:";<br />while(l <max) //這看出b是用來儲存結果的,由高位到低位;b[max-1]為個位,b[max-2]為十位,依此類推<br />{cout<<b[l];l++;}<br />cout<<endl;</p><p>cout<<NFai(n)<<endl;</p><p>}

 

對於
for(k=1;k <i;k++) 這句,
假如此時i=3,j=max-1,
那新個位 就是 3個以前結果的個位相加並進位後剩下的個位。(迴圈開始時a[max-1],b[max-1]都是以前結果的個位)

 

 

(二)

轉自http://www.programfan.com/blog/article.asp?id=568

#include<iostream><br />#include<stack><br />#include<fstream><br />using namespace std;<br />struct Node<br />{<br /> int i;<br /> Node *next;<br />};<br />Node *createNode()<br />{<br /> Node *node=new Node;<br /> node->i=0;<br /> node->next=NULL;<br /> return node;<br />}<br />Node* MulLink(Node *head,int i)<br />{<br /> Node *p=head;<br /> head->i=1;<br /> p=head;<br /> int temp=0;<br /> for(int j=1;j<=i;j++)<br /> {<br /> while(p)<br /> {<br /> p->i*=j;<br /> p->i+=temp;<br /> if(p->i>9)<br /> {<br /> temp=p->i/10;<br /> if(!p->next)<br /> p->next=createNode();<br /> p->i%=10;<br /> p=p->next;<br /> }<br /> else<br /> {<br /> temp=0;<br /> p=p->next;<br /> }<br /> }<br /> p=head;<br /> }<br /> return head;<br />}<br />void displayLink(Node *head)<br />{<br /> fstream outfile;<br /> stack<int> display;<br /> outfile.open("example.txt",ios::out|ios::ate);<br /> while(head)<br /> {<br /> display.push(head->i);<br /> head=head->next;<br /> }<br /> while(!display.empty())<br /> {<br /> cout<<display.top();<br /> outfile<<display.top();<br /> display.pop();<br /> }<br /> cout<<endl;<br />}<br />void freeLink(Node *head)<br />{<br /> Node *p=head;<br /> while(p)<br /> {<br /> head=p->next;<br /> delete p;<br /> p=head;<br /> }<br />}<br />int main(int argc,char *argv[])<br />{<br /> int n;<br /> cout<<"Please input the number"<<endl;<br /> cin>>n;<br /> Node *head=createNode();<br /> MulLink(head,n);<br /> displayLink(head);<br /> freeLink(head);<br /> system("PAUSE");<br /> return 0;<br />}</p><p>

 

(三)

轉自http://download.csdn.net/source/629944

#include <stdlib.h><br />#include <time.h><br />#include <stdio.h><br />#include <string.h></p><p>#define MAXSIZE 100000<br />#define RADIX 10000<br />#define LOG10_RADIX 4</p><p>void Change(long a[] , int &m) ;<br />int Factorial(long, long a[]);</p><p>int main()<br />{<br /> long a[MAXSIZE] = {0} ;</p><p> int n;<br /> printf("Input a number: ");<br /> scanf("%d", &n);</p><p> long t;<br /> t = clock();</p><p> int m = Factorial(n, a);</p><p> t = clock()-t;</p><p> printf("%d", a[m]);<br /> for(int l=m-1 ; l>=0 ; l--) //輸出結果<br /> {<br /> printf("%04d", a[l]) ;<br /> if((l*LOG10_RADIX) % 10000 == 0)<br /> system("pause");<br /> }</p><p> printf("/n");<br /> printf("Time cost: %dms/n", t);<br /> system("pause") ; </p><p> return 0;<br />}</p><p>void Change(long a[] , int &m)<br />{<br /> int b = 0 ; //b表示低位向高位的進位<br /> for(int i=0 ; i<m ; i++)<br /> {<br /> a[i] += b ;<br /> if(a[i] < RADIX) //當a[i]<9時,說明這裡不做進位處理 // <=<br /> {<br /> b = 0 ;<br /> }<br /> else if(a[i] >= RADIX) //當a[i]不是最高位時,滿足條件只進位<br /> {<br /> b = a[i] / RADIX ;<br /> a[i] -= b* RADIX ;<br /> }<br /> }</p><p> a[i] += b;<br /> while(a[i] >= RADIX)<br /> {<br /> b = a[i] / RADIX ;<br /> a[i] -= b* RADIX ;<br /> i++ ;<br /> a[i] = b ;<br /> ++m; // 增加一個結點<br /> }<br />}</p><p>// 求n的階乘,結果存放到a數組中<br />int Factorial(long n, long a[])<br />{<br /> memset(a, 0, MAXSIZE*sizeof(long));</p><p> a[0] = 1 ;<br /> int m =0 , b=0 ;</p><p> for(int i=2 ; i<=n ; i++)<br /> {<br /> for(int j=0 ; j <= m ; j++) //把每一個元素分別乘以i,並儲存在原來的位置<br /> {<br /> a[j] = a[j] * i ;<br /> }</p><p> Change(a, m) ; //對上面的每個元素分別做調整 ,每乘一次做一次調整<br /> }</p><p> return m;<br />}<br />

 

(四)

轉自http://hi.baidu.com/peng3409/blog/item/87917cd997b747ec38012f6d.html

HDU 1042—題目要求計算10000!大約有35000~36000位,用上篇介紹的方法是滿足不了需求的。分析,我們可以知道計算時所需要的時間耗費在進位處理上,由於我們使用10進位方式,結果導致計算長度len很大。為了減少計算時間,做一點改動,將進位改為10^10,這樣進位長度大大縮減,由於10^10超過int的範圍,我們使用__int64(注意,兩個底線)。提交到杭州電子科技大學的ACM判題系統顯示耗時1720MS,如果想進一步減少時間可以通過擴大基數來實現,不過原理就類似了。

#include <iostream></p><p>#include <cmath></p><p>using namespace std;</p><p>const int max_len=36000;//</p><p>const __int64 base5=100000;</p><p>const __int64 base=base5*base5;</p><p>__int64 x[max_len];</p><p>int len;</p><p>void fact(int n)</p><p>{</p><p> __int64 carry;</p><p> int i,j;</p><p> for(i=0;i<max_len;++i)</p><p> x[i]=0;</p><p> x[0]=1;</p><p> len=1;</p><p> for(i=1;i<=n;++i)</p><p> {</p><p> carry=0;</p><p> for(j=0;j<len;++j)</p><p> {</p><p> x[j]=carry+x[j]*i;</p><p> carry=x[j]/base;</p><p> x[j]=x[j]%base; </p><p> }</p><p> while(carry)</p><p> {</p><p> x[j++]=carry%base;</p><p> carry=carry/base;</p><p> len++;</p><p> }</p><p> }</p><p>}</p><p>int main()</p><p>{</p><p> int n;</p><p> while(scanf("%d",&n)!=EOF&&n>=0)</p><p> {</p><p> fact(n);</p><p> int i;</p><p> printf("%I64d",x[len-1]);</p><p> for(i=len-2;i>=0;i--)</p><p> {//Èôx[i]²»×ã9λÊý£¬Ç°Ãæ²¹Áã¡£</p><p> if(x[i]<10) printf("000000000");</p><p> else if(x[i]<100)printf("00000000");</p><p> else if(x[i]<1000)printf("0000000");</p><p> else if(x[i]<10000)printf("000000");</p><p> else if(x[i]<100000)printf("00000");</p><p> else if(x[i]<1000000)printf("0000");</p><p> else if(x[i]<10000000)printf("000");</p><p> else if(x[i]<100000000)printf("00");</p><p> else if(x[i]<1000000000)printf("0");</p><p> printf("%I64d",x[i]);</p><p> }</p><p> printf("/n");</p><p> }</p><p> return 0;</p><p>}<br />

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.