大數(shù)階乘問題C中課程設計絕無僅有
西安建筑科技大學課程設計(論文)
課程設計(論文)
課程名稱:
題 目: 求解1000的階乘
院 (系): 理學院
專業(yè)班級: 應數(shù)0801
姓 名:
學 號: 081030107
指導教師:
2011年 1 月 14 日
摘要
計算數(shù)字的階乘問題,是比較常見,而且比較重要的一種函數(shù)。其中計算一般較小的數(shù)字時,采用迭代法,這種方法簡潔、方便。但是,在運算一些較大的數(shù)字的階乘時,例如計算1000的階乘,由于沒有任何一個編程語言有一種變量或機制來儲存1000!這么大的數(shù),所以就會產(chǎn)生數(shù)字越界問題,也叫上溢。因此,如何計算大數(shù)的階乘問題就是本文研究的重點。本文詳細討論了如何采用數(shù)組的方法計算原題,從而避免數(shù)字越界問題。
關鍵詞:越界,數(shù)組,階乘
目錄
1.緒論 4
2.程序說明 4
2.1問題描述 4
2.2開發(fā)平臺 4
2.3變量命名規(guī)則4
3.程序設計 5
3.1設計思路:5
3.2設計難點及處理6
4.結果及分析6
4.1運行結果 6
4.2結果分析7
4.3需要完善的地方8
4.4心得體會8
5.參考文獻9
6.附錄10
1.緒論
在數(shù)學計算的很多領域中都涉及數(shù)字的階乘問題,因此,數(shù)字的階乘問題是十分常見且重要的一種函數(shù)。一般情況下,計算較小的數(shù)字的階乘時,采用遞歸調用算法。這個是最容易想的,如果是1的階乘,則返回1,其他的都返回n-1的階乘與n的積,循環(huán)調用即可。不過問題是即使用double來存放該值,由于double本身的精度、能存的數(shù)字大小所限,算不了太大的數(shù)的階乘。因此,計算較大數(shù)字的階乘時,一種簡潔高效的算法的開發(fā)就顯得十分緊迫和重要了。
2.程序說明
2.1問題描述:
求解1000的階乘
2.2開發(fā)平臺:
Microsoft Visual C++ 6.0
2.3變量命名規(guī)則
numArr[] 數(shù)組
total 數(shù)組元素的值
rem 余數(shù)
i 數(shù)組元素編號
count 數(shù)組元素需乘的數(shù)
3.程序設計
3.1設計思路:
用numArr[]數(shù)組來存放階乘的每一位數(shù)字,首先令數(shù)組的最后一位的數(shù)值為1,位數(shù)為1,然后將每次相乘的乘積存回數(shù)組,并循環(huán)處理每個數(shù)組中超過10的數(shù),若數(shù)值超過10,則需要進位,將位數(shù)加1,原來的數(shù)除以10,商數(shù)加前一位數(shù)的數(shù)值后存回前一位數(shù)的數(shù)組中,再將余數(shù)存回原來位數(shù)的數(shù)組中。
例如,求12!
12! = 11!* 12
11! = 39916800
12! = 479001600
3.2設計難點及處理
由于位數(shù)的限制,沒有任何編程語言,可以存儲例如1000!這個乘法結果的量。解決的方法是采用數(shù)組來存儲。
4.結果及分析
4.1運行結果
4.2結果分析
通過使用數(shù)組的方法,可以有效避免數(shù)字越界問題,存儲較大數(shù)字的階乘,得到準確的計算結果。
4.3需要完善的地方
程序的編寫有待進一步的精簡,本程序可以解決1000的階乘問題,但對于特別巨大的數(shù)字的階乘問題還是無法解決。并且不能用迭代法計算較小數(shù)的階乘??稍诖嘶A上編寫萬能階乘計算程序。
4.4心得體會
通過這次的課程設計,我查閱了很多資料,并和同學們一起討論,使我學會了獨立自學,以及如何互相討論學習,增強了我對于C++語言的掌握,和編寫程序的能力。使我受益匪淺。
5.參考文獻
[1] (美) Bjarne Stroustrup 著. C++程序設計語言(特別版). ( 裘宗燕 ).北京: 機械工業(yè)出版社,2002.125~188
[2] 何渝編 著.計算機常用數(shù)值算法與程序[M].北京:人民郵電出版社,2003.73~125
[3]鄭麗 著.C++語言程序設計(第4版)[M].北京:清華大學出版社,2010.188~248
[4]龔志祥 著.Visual C++編程實例與技巧集粹[M].北京:兵器工業(yè)出版社,2004.265~312
[5](美)Barbara Moo, Andrew Koening 著.C++沉思錄.(梁實秋).北京:人民郵電出版社,2008.86~137
6.附錄
核心源程序:
#include<iostream.h>
#include<conio.h>
void main()
{
clrscr();
int numArr[3000]; // Approximately , size of array depends on size of factorial.
int total,rem=0,count; //rem use to save remainder of division(Carry Number).
register int i;
for(i=0;i<3000;i++)
numArr[i]=0; //set all array on NULL.
i=2999; //start from end of array.
numArr[2999]=1;
for(count=2;count<=1000;count++)//Refer to my article for more explanation.
{
while(i>0)
{
total=numArr[i]*count+rem;
rem=0;
if(total>9)
{
numArr[i]=total%10;
rem=total/10;
}
else
numArr[i]=total;
i--;
}
rem=0;
total=0;
i=2999;
}
for(i=0;i<3000;i++) // Display arrays cell to show factorial 1000
{
if(numArr[i]!=0 | count==1)
{
cout<<numArr[i];
count=1;
}
}
getch();
}
- 11 -