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