C#程序设计-多位水仙花数计算.doc_第1页
C#程序设计-多位水仙花数计算.doc_第2页
C#程序设计-多位水仙花数计算.doc_第3页
C#程序设计-多位水仙花数计算.doc_第4页
C#程序设计-多位水仙花数计算.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#程序设计课程设计题 目: 多位水仙花数的计算机实现专 业: 计算机科学与技术 学 号: 姓 名: 指导老师: 完成日期: 2012-04-13 1目 录1 前言12 课题介绍12.1功能要求12.2主要任务12.3运行环境12.4开发语言23 概要设计与详细设计23.1系统流程图23.2详细设计24 关键代码与特色功能的实现34.1关键代码34.2特色功能的实现125 课程设计总结15参考文献15评语及成绩01 前言在正整数中存在着许多数具有迷人的特性,如谭浩强教授在文献1第 120页中提到的水仙花数所谓的水仙花数就是满足组成它的各位数字的n次方之和恰好等于它本身的n位正整数。最早被人们认识的水仙花数为 153。谈祥柏教授在文献2第7475页中谈到“数论大师(Hardy)在其名著 数学家的辨解中曾指出过,有四个三位数具有这种性质,除153外,其他三数为370,371与407。”,文献3也给出了由88个 自然数组成的水仙花数表。近年来计算机的发展及应用突飞猛进也为水仙花数的计算提供了很好的计算工具。但是,如果对每一个n 位正整数、求出它的各位数的次方之和,进而通过判别得到的和是否与它本身相等来判别该数是否为水仙花数,则需要遍历每一个正整数,可以看出每当位数增加1时,所要处理的正整数个数将增加1O倍。因此,当位数n增大时,其计算量将呈几何级数骤增。显然这种方法只适用于n 较小的情况,对于较大的n如果也采用这种方法,即使应用计算机计算也是很困难的。本文从应用计算机计算水仙花数的角度出发,讨论应用计算机快速计算所有水仙花数的算法。2 课题介绍2.1功能要求(1)用C#语言实现程序设计;(2)循序渐进地从低位到多位展示水仙花数的计算机实现;(3)界面友好(良好的人机互交),程序要有注释。2.2主要任务(1)创建窗体作为交换和展示界面;(2)实现三位水仙花数的多种实现;(3)实现3-9位水仙花数的计算和展示;(4)实现3-17位水仙花数的计算和展示;(5)定义结构实现3-60位水仙花数的计算。2.3运行环境(1)WINDOWS2003/XP系统(2)Visual Studio 2008开发环境2.4开发语言C#语言3 概要设计与详细设计3.1系统流程图系统的主要功能包括多位水仙花数的计算系统的流程及框架如图3.1所示。水仙花数简介3位水仙花数3-9位水仙花数3-17位水仙花数3-60位水仙花数单层循环计算三层循环计算递归计算BIGINT结构定义计算图3.1 系统流程图3.2详细设计(1)功能计算0-9的n次幂的详细设计计算0-9的n次幂功能是计算0-9的n次幂该功能的实现流程如下:private void CalculateArray(int n, long array) /Console.WriteLine计算并保存0-9的n次幂 for (int i = 0; i = 9; i+) arrayi = i; for (int j = 2; j = numLength; j+) arrayi *= i; (2)功能数组比较的详细设数据比较功能是比较判断两数组是否相等,如果两数组的每个对应元素都想等,则这两个数组相等。该功能的实现如下: private bool arrayEqual(long arrayLeft, long arrayRight) bool flag; flag = true; for (int i = 0; i = 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 = limit) throw new OverflowException(BigInt的long型加数不得超过最大的八位数); BigInt num = new BigInt(lhs); long carry = 0; /保存进位 num.bigInt0 = num.bigInt0 + rhs; for (int i = 0; i limit) carry = num.bigInti / limit; num.bigInti = num.bigInti % limit; /检测carry是否为0,如果不为0则表示num.bigInt7产生l进位溢出 if (carry 0) throw new OverflowException(BigInt与long加法运算后结果产生溢出即超过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; /保存进位 for (int i = 0; i = limit) carry = sum.bigInti / limit; sum.bigInti = sum.bigInti % limit; /检测carry是否为0,如果不为0则表示num.bigInt7产生l进位溢出 if (carry 0) throw new OverflowException(BigInt与BigInt型加法法运算后结果产生溢出即超过64位); return sum; public static BigInt operator *(BigInt lhs, long rhs) if (rhs = limit) throw new OverflowException(BigInt的乘数不得超过最大的八位数); BigInt num = new BigInt(lhs); long carry=0; /保存进位 for (int i = 0; i = limit) carry = num.bigInti / limit; num.bigInti = num.bigInti % limit; /检测carry是否为0,如果不为0则表示num.bigInt7产生l进位溢出 if (carry 0) throw new OverflowException(BigInt乘法运算后结果产生溢出即超过64位); return num; public static BigInt operator *(long lhs, BigInt rhs) if (lhs = limit) throw new OverflowException(与BigInt相乘的long型数据不得超过最大的八位数); BigInt num = new BigInt(rhs); long carry = 0; /保存进位 for (int i = 0; i = limit) carry = num.bigInti / limit; num.bigInti = num.bigInti % limit; /检测carry是否为0,如果不为0则表示num.bigInt7产生l进位溢出 if (carry 0) throw new OverflowException(BigInt乘法运算后结果产生溢出即超过64位); return num; public static BigInt operator /(BigInt lhs, long rhs) if (rhs = limit) throw new OverflowException(BigInt的除数不得超过最大的八位数); BigInt num = new BigInt(lhs); long carry = 0; /保持每位除后的余数 for (int i = 7; i = 0; i-) /运算逻辑每位加上上一位的余数然后在除;把该位除得的余数保存在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 lhs, long rhs) if (rhs = limit) throw new OverflowException(BigInt的模数不得超过最大的八位数); BigInt num = new BigInt(lhs); long carry = 0; /保持每位除后的余数 for (int i = 7; i = 0; i-) /运算逻辑每位加上上一位的余数然后在除;把该位除得的余数保存在carr,商保存num.bigInti。 num.bigInti = num.bigInti + carry * limit; carry = num.bigInti % 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 (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 += lhs.bigInti + 1 * limit; if (lhs.bigInti rhs) return true; lhs.bigInti = lhs.bigInti % limit; return false; public static bool operator = new BigInt(rhs) return false; else return true; public static bool operator =(BigInt lhs, BigInt rhs) for (int i = 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 = 0; i-) if (lhs.bigInti rhs.bigInti) return true; return false; public static bool operator = 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.bigInt7, this.bigInt6, this.bigInt5, this.bigInt4, this.bigInt3, this.bigInt2, this.bigInt1, this.bigInt0); /结构定义结束多位水仙花数计算函数:如果对每一个n 位正整数、求出它的各位数的次方之和,进而通过判别得到的和是否与它本身相等来判别该数是否为水仙花数,则需要遍历每一个正整数,可以看出每当位数增加1时,所要处理的正整数个数将增加1O倍。因此,当位数n增大时,其计算量将呈几何级数骤增。显然这种方法只适用于n 较小的情况,对于较大的n如果也采用这种方法,即使应用计算机计算也是很困难的。本系统的思路是,对于给定的n位数。这个数字中0,1,2,3,4,5,6,7,8,9的位数之后一定为n,然后依次累加0的n次幂乘以0的个数、1的n次幂乘以1的个数、2的n次幂乘以2的个数。如果所得的和等于这个数,则这个数就是水仙花数。具体代码如下:private void Entrance(int n) /主函数开始 /定义所求水仙花数的位数,有效值为3-60. long time = 0; long arraySum = new long10; /记录循环遍历中0-9的个数 long i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; /循环控制变量 BigInt numStart = new BigInt(1); BigInt numEnd = new BigInt(1); BigInt basic = new BigInt(0); BigInt array = new BigInt10; /保存0-9的n次幂 /计算n位数的最小值和最大值 for (int i = 1; i = 0; i9-) /9 arraySum9 = i9; basic = i9 * array9; if (basic = numEnd) continue; 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 = 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) continue; 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 + i5 * array5 + i4 * array4 + i3 * array3; if (basic = numEnd) continue; for (i2 = n - i9 - i8 - i7 - i6 - i5 - i4 - i3; i2 = 0; i2-) /2 arraySum2 = i2; basic = i9 * a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论