C程序設(shè)計(jì)多位水仙花數(shù)計(jì)算_第1頁
C程序設(shè)計(jì)多位水仙花數(shù)計(jì)算_第2頁
C程序設(shè)計(jì)多位水仙花數(shù)計(jì)算_第3頁
C程序設(shè)計(jì)多位水仙花數(shù)計(jì)算_第4頁
C程序設(shè)計(jì)多位水仙花數(shù)計(jì)算_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C#程序設(shè)計(jì)課程設(shè)計(jì)題 目: 多位水仙花數(shù)的計(jì)算機(jī)實(shí)現(xiàn)專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 號: 姓 名: 指導(dǎo)老師: 完成日期: 2012-04-13 目 錄1 前言12 課題介紹12.1功能要求12.2主要任務(wù)12.3運(yùn)行環(huán)境12.4開發(fā)語言23 概要設(shè)計(jì)與詳細(xì)設(shè)計(jì)23.1系統(tǒng)流程圖23.2詳細(xì)設(shè)計(jì)24 關(guān)鍵代碼與特色功能的實(shí)現(xiàn)34.1關(guān)鍵代碼34.2特色功能的實(shí)現(xiàn)125 課程設(shè)計(jì)總結(jié)15參考文獻(xiàn)15評語及成績01 前言在正整數(shù)中存在著許多數(shù)具有迷人的特性,如譚浩強(qiáng)教授在文獻(xiàn)1第 120頁中提到的水仙花數(shù)所謂的水仙花數(shù)就是滿足組成它的各位數(shù)字的n次方之和恰好等于它本身的n位正整數(shù)。最早被人們認(rèn)識

2、的水仙花數(shù)為 153。談祥柏教授在文獻(xiàn)2第7475頁中談到“數(shù)論大師(Hardy)在其名著 數(shù)學(xué)家的辨解中曾指出過,有四個(gè)三位數(shù)具有這種性質(zhì),除153外,其他三數(shù)為370,371與407?!保墨I(xiàn)3也給出了由88個(gè) 自然數(shù)組成的水仙花數(shù)表。近年來計(jì)算機(jī)的發(fā)展及應(yīng)用突飛猛進(jìn)也為水仙花數(shù)的計(jì)算提供了很好的計(jì)算工具。但是,如果對每一個(gè)n 位正整數(shù)、求出它的各位數(shù)的次方之和,進(jìn)而通過判別得到的和是否與它本身相等來判別該數(shù)是否為水仙花數(shù),則需要遍歷每一個(gè)正整數(shù),可以看出每當(dāng)位數(shù)增加1時(shí),所要處理的正整數(shù)個(gè)數(shù)將增加1O倍。因此,當(dāng)位數(shù)n增大時(shí),其計(jì)算量將呈幾何級數(shù)驟增。顯然這種方法只適用于n 較小的情況,

3、對于較大的n如果也采用這種方法,即使應(yīng)用計(jì)算機(jī)計(jì)算也是很困難的。本文從應(yīng)用計(jì)算機(jī)計(jì)算水仙花數(shù)的角度出發(fā),討論應(yīng)用計(jì)算機(jī)快速計(jì)算所有水仙花數(shù)的算法。2 課題介紹2.1功能要求(1)用C#語言實(shí)現(xiàn)程序設(shè)計(jì);(2)循序漸進(jìn)地從低位到多位展示水仙花數(shù)的計(jì)算機(jī)實(shí)現(xiàn);(3)界面友好(良好的人機(jī)互交),程序要有注釋。2.2主要任務(wù)(1)創(chuàng)建窗體作為交換和展示界面;(2)實(shí)現(xiàn)三位水仙花數(shù)的多種實(shí)現(xiàn);(3)實(shí)現(xiàn)3-9位水仙花數(shù)的計(jì)算和展示;(4)實(shí)現(xiàn)3-17位水仙花數(shù)的計(jì)算和展示;(5)定義結(jié)構(gòu)實(shí)現(xiàn)3-60位水仙花數(shù)的計(jì)算。2.3運(yùn)行環(huán)境(1)WINDOWS2003/XP系統(tǒng)(2)Visual Studio 2

4、008開發(fā)環(huán)境2.4開發(fā)語言C#語言3 概要設(shè)計(jì)與詳細(xì)設(shè)計(jì)3.1系統(tǒng)流程圖系統(tǒng)的主要功能包括多位水仙花數(shù)的計(jì)算系統(tǒng)的流程及框架如圖3.1所示。水仙花數(shù)簡介3位水仙花數(shù)3-9位水仙花數(shù)3-17位水仙花數(shù)3-60位水仙花數(shù)單層循環(huán)計(jì)算三層循環(huán)計(jì)算遞歸計(jì)算BIGINT結(jié)構(gòu)定義計(jì)算圖3.1 系統(tǒng)流程圖3.2詳細(xì)設(shè)計(jì)(1)功能計(jì)算0-9的n次冪的詳細(xì)設(shè)計(jì)計(jì)算0-9的n次冪功能是計(jì)算0-9的n次冪該功能的實(shí)現(xiàn)流程如下:private void CalculateArray(int n, long array) /Console.WriteLine計(jì)算并保存0-9的n次冪 for (int i = 0; i

5、 <= 9; i+) arrayi = i; for (int j = 2; j <= numLength; j+) arrayi *= i; (2)功能數(shù)組比較的詳細(xì)設(shè)數(shù)據(jù)比較功能是比較判斷兩數(shù)組是否相等,如果兩數(shù)組的每個(gè)對應(yīng)元素都想等,則這兩個(gè)數(shù)組相等。該功能的實(shí)現(xiàn)如下: private bool arrayEqual(long arrayLeft, long arrayRight) bool flag; flag = true; for (int i = 0; i < 10; i+) if (arrayLefti = arrayRighti) /do nothing e

6、lse flag = false; return false; return flag; (3)讀取文件功能的詳細(xì)設(shè)計(jì) 讀取文件函數(shù)的功能是從給的的文件名中讀去文件并顯示在窗體的文本框中。 該功能的詳細(xì)實(shí)現(xiàn)如下:/讀取文件 private void ReadText(string fileName) richTextBox1.Clear(); if (File.Exists(fileName) using (StreamReader sr = File.OpenText(fileName) String input; while (input = sr.ReadLine() != null)

7、richTextBox1.Text += input + "n" sr.Close(); 4 關(guān)鍵代碼與特色功能的實(shí)現(xiàn)4.1關(guān)鍵代碼C#的long型數(shù)據(jù)只能保存17位的十進(jìn)制正整數(shù),然后要計(jì)算18及更多位數(shù)的水仙花數(shù)則會溢出,所以在本系統(tǒng)中定義了一個(gè)BigInt結(jié)構(gòu)。來保存64位的正整數(shù)。定義如下:/結(jié)構(gòu)定義開始 struct BigInt private long bigInt; private static long limit = 100000000; /構(gòu)造函數(shù) public BigInt(long a) bigInt = new long8; long b = l

8、imit * limit; if (a >= b) throw new OverflowException("初始值必須小于10*16"); else bigInt0 = a % limit; bigInt1 = a / limit; public BigInt(BigInt a) bigInt = new long8; for (int i = 0; i < 8; i+) bigInti = a.bigInti; /顯示實(shí)現(xiàn)轉(zhuǎn)換符操作,主要用于求模后賦值 public static explicit operator long(BigInt lhs) retu

9、rn lhs.bigInt0; public static explicit operator int(BigInt lhs) return (int)lhs.bigInt0; /運(yùn)算符重載 public static BigInt operator +(BigInt lhs, long rhs) if (rhs >= limit) throw new OverflowException("BigInt的long型加數(shù)不得超過最大的八位數(shù)"); BigInt num = new BigInt(lhs); long carry = 0; /保存進(jìn)位 num.bigInt

10、0 = num.bigInt0 + rhs; for (int i = 0; i < 8; i+) num.bigInti = num.bigInti + carry; carry = 0; if (num.bigInti > limit) carry = num.bigInti / limit; num.bigInti = num.bigInti % limit; /檢測carry是否為0,如果不為0則表示num.bigInt7產(chǎn)生l進(jìn)位溢出 if (carry > 0) throw new OverflowException("BigInt與long加法運(yùn)算后結(jié)

11、果產(chǎn)生溢出即超過64位"); return num; public static BigInt operator +(BigInt lhs, BigInt rhs) BigInt sum = new BigInt(0); BigInt numLeft = new BigInt(lhs); BigInt numRight = new BigInt(rhs); long carry = 0; /保存進(jìn)位 for (int i = 0; i < 8; i+) sum.bigInti = carry + numLeft.bigInti + numRight.bigInti; carry

12、 = 0; if (sum.bigInti >= limit) carry = sum.bigInti / limit; sum.bigInti = sum.bigInti % limit; /檢測carry是否為0,如果不為0則表示num.bigInt7產(chǎn)生l進(jìn)位溢出 if (carry > 0) throw new OverflowException("BigInt與BigInt型加法法運(yùn)算后結(jié)果產(chǎn)生溢出即超過64位"); return sum; public static BigInt operator *(BigInt lhs, long rhs) if

13、 (rhs >= limit) throw new OverflowException("BigInt的乘數(shù)不得超過最大的八位數(shù)"); BigInt num = new BigInt(lhs); long carry=0; /保存進(jìn)位 for (int i = 0; i < 8; i+) /運(yùn)算邏輯:每位先乘然后加上前一位的進(jìn)位并清空進(jìn)位 num.bigInti = num.bigInti * rhs; num.bigInti+=carry; carry=0; /如此進(jìn)位后超出limit則產(chǎn)生新的進(jìn)位 if (num.bigInti >= limit) c

14、arry = num.bigInti / limit; num.bigInti = num.bigInti % limit; /檢測carry是否為0,如果不為0則表示num.bigInt7產(chǎn)生l進(jìn)位溢出 if (carry > 0) throw new OverflowException("BigInt乘法運(yùn)算后結(jié)果產(chǎn)生溢出即超過64位"); return num; public static BigInt operator *(long lhs, BigInt rhs) if (lhs >= limit) throw new OverflowExceptio

15、n("與BigInt相乘的long型數(shù)據(jù)不得超過最大的八位數(shù)"); BigInt num = new BigInt(rhs); long carry = 0; /保存進(jìn)位 for (int i = 0; i < 8; i+) /運(yùn)算邏輯:每位先乘然后加上前一位的進(jìn)位并清空進(jìn)位 num.bigInti = num.bigInti * lhs; num.bigInti += carry; carry = 0; /如此進(jìn)位后超出limit則產(chǎn)生新的進(jìn)位 if (num.bigInti >= limit) carry = num.bigInti / limit; num

16、.bigInti = num.bigInti % limit; /檢測carry是否為0,如果不為0則表示num.bigInt7產(chǎn)生l進(jìn)位溢出 if (carry > 0) throw new OverflowException("BigInt乘法運(yùn)算后結(jié)果產(chǎn)生溢出即超過64位"); return num; public static BigInt operator /(BigInt lhs, long rhs) if (rhs >= limit) throw new OverflowException("BigInt的除數(shù)不得超過最大的八位數(shù)&quo

17、t;); BigInt num = new BigInt(lhs); long carry = 0; /保持每位除后的余數(shù) for (int i = 7; i >= 0; i-) /運(yùn)算邏輯每位加上上一位的余數(shù)然后在除;把該位除得的余數(shù)保存在carr,商保存num.bigInti。 num.bigInti = num.bigInti + carry * limit; carry = num.bigInti % rhs; num.bigInti = num.bigInti / rhs; return num; public static BigInt operator %(BigInt l

18、hs, long rhs) if (rhs >= limit) throw new OverflowException("BigInt的模數(shù)不得超過最大的八位數(shù)"); BigInt num = new BigInt(lhs); long carry = 0; /保持每位除后的余數(shù) for (int i = 7; i >= 0; i-) /運(yùn)算邏輯每位加上上一位的余數(shù)然后在除;把該位除得的余數(shù)保存在carr,商保存num.bigInti。 num.bigInti = num.bigInti + carry * limit; carry = num.bigInti

19、% rhs; num.bigInti = num.bigInti / rhs; return new BigInt(carry); public static bool operator =(BigInt lhs, BigInt rhs) bool flag; flag = true; for (int i = 0; i < 8; i+) if (lhs.bigInti = rhs.bigInti) /do nothing else return false; return flag; public static bool operator !=(BigInt lhs, BigInt r

20、hs) if (lhs = rhs) return false; else return true; public static bool operator >(BigInt lhs, BigInt rhs) for (int i = 7; i >= 0; i-) if (lhs.bigInti > rhs.bigInti) return true; return false; public static bool operator >(BigInt lhs, long rhs) for (int i = 6; i >= 0; i-) lhs.bigInti +=

21、 lhs.bigInti + 1 * limit; if (lhs.bigInti > rhs) return true; lhs.bigInti = lhs.bigInti % limit; return false; public static bool operator <(BigInt lhs, long rhs) if (lhs >= new BigInt(rhs) return false; else return true; public static bool operator >=(BigInt lhs, BigInt rhs) for (int i

22、= 7; i >= 0; i-) long a = lhs.bigInti; long b = rhs.bigInti; if (a != 0 && b != 0) if (a < b) return false; else if (a = 0) return false; return true; public static bool operator <(BigInt lhs, BigInt rhs) for (int i = 7; i >= 0; i-) if (lhs.bigInti < rhs.bigInti) return true;

23、return false; public static bool operator <=(BigInt lhs, BigInt rhs) for (int i = 7; i >= 0; i-) if (rhs.bigInti != 0) if (lhs.bigInti >= rhs.bigInti) return false; return true; public override string ToString() return String.Format("0:d8 1:d8 2:d8 3:d8 4:d8 5:d8 6:d8 7:d8", this.

24、bigInt7, this.bigInt6, this.bigInt5, this.bigInt4, this.bigInt3, this.bigInt2, this.bigInt1, this.bigInt0); /結(jié)構(gòu)定義結(jié)束多位水仙花數(shù)計(jì)算函數(shù):如果對每一個(gè)n 位正整數(shù)、求出它的各位數(shù)的次方之和,進(jìn)而通過判別得到的和是否與它本身相等來判別該數(shù)是否為水仙花數(shù),則需要遍歷每一個(gè)正整數(shù),可以看出每當(dāng)位數(shù)增加1時(shí),所要處理的正整數(shù)個(gè)數(shù)將增加1O倍。因此,當(dāng)位數(shù)n增大時(shí),其計(jì)算量將呈幾何級數(shù)驟增。顯然這種方法只適用于n 較小的情況,對于較大的n如果也采用這種方法,即使應(yīng)用計(jì)算機(jī)計(jì)算也是很困難的。本

25、系統(tǒng)的思路是,對于給定的n位數(shù)。這個(gè)數(shù)字中0,1,2,3,4,5,6,7,8,9的位數(shù)之后一定為n,然后依次累加0的n次冪乘以0的個(gè)數(shù)、1的n次冪乘以1的個(gè)數(shù)、2的n次冪乘以2的個(gè)數(shù)。如果所得的和等于這個(gè)數(shù),則這個(gè)數(shù)就是水仙花數(shù)。具體代碼如下:private void Entrance(int n) /主函數(shù)開始 /定義所求水仙花數(shù)的位數(shù),有效值為3-60. long time = 0; long arraySum = new long10; /記錄循環(huán)遍歷中0-9的個(gè)數(shù) long i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; /循環(huán)控制變量 BigInt n

26、umStart = new BigInt(1); BigInt numEnd = new BigInt(1); BigInt basic = new BigInt(0); BigInt array = new BigInt10; /保存0-9的n次冪 /計(jì)算n位數(shù)的最小值和最大值 for (int i = 1; i < n; i+) numStart = numStart * 10; numEnd = numStart * 10; /計(jì)算并保存0-9的n次冪 CalculateArray(n, array); richTextBox1.Text += string.Format(&quo

27、t;開始數(shù)值:n0", numStart) + "rn" richTextBox1.Text += string.Format("結(jié)束數(shù)值:n0", numEnd) + "rn" richTextBox1.Text += n.ToString() + "位數(shù)的水仙花數(shù)" + "rn" for (i9 = n; i9 >= 0; i9-) /9 arraySum9 = i9; basic = i9 * array9; if (basic >= numEnd) continue

28、; for (i8 = n - i9; i8 >= 0; i8-) /8 arraySum8 = i8; basic = i9 * array9 + i8 * array8; if (basic >= numEnd) continue; for (i7 = n - i9 - i8; i7 >= 0; i7-) /7 arraySum7 = i7; basic = i9 * array9 + i8 * array8 + i7 * array7; if (basic >= numEnd) continue; for (i6 = n - i9 - i8 - i7; i6 &g

29、t;= 0; i6-) /6 arraySum6 = i6; basic = i9 * array9 + i8 * array8 + i7 * array7 + i6 * array6; if (basic >= numEnd) continue; for (i5 = n - i9 - i8 - i7 - i6; i5 >= 0; i5-) /5 arraySum5 = i5; basic = i9 * array9 + i8 * array8 + i7 * array7 + i6 * array6 + i5 * array5; if (basic >= numEnd) co

30、ntinue; for (i4 = n - i9 - i8 - i7 - i6 - i5; i4 >= 0; i4-) /4 arraySum4 = i4; basic = i9 * array9 + i8 * array8 + i7 * array7 + i6 * array6 + i5 * array5 + i4 * array4; if (basic >= numEnd) continue; for (i3 = n - i9 - i8 - i7 - i6 - i5 - i4; i3 >= 0; i3-) /3 arraySum3 = i3; basic = i9 * array9 + i8 * array8 + i7 * array7 + i6 * array6 + i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論