用Matlab求水仙花数完美数回文数和亲合数_第1页
用Matlab求水仙花数完美数回文数和亲合数_第2页
用Matlab求水仙花数完美数回文数和亲合数_第3页
用Matlab求水仙花数完美数回文数和亲合数_第4页
用Matlab求水仙花数完美数回文数和亲合数_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、题目:对深圳市人口及医疗的预测 编号: 10055 队长 李 荣 姓名: 李 荣 (09041117) 王 遂 (09041124) 李春晓 (09055025)1.水仙花数:(1)题目若一个三位数自然数的各位数的各位数字的立方和等于该数本身,则称该数为水仙花数,例如,153=13+53+33,所以153为水仙花数,编程计算所有水仙花数.(2)分析问题:本题特点在于一个数的各个位数立方和与其本身的关系很明确且很简单,可以用if语句或find语句来完成.如果用if语句,则又有两种选择:1.命一个三位数,再表示其各个位数的数字;2.命各个位数的数字,再表示该三位数.如果用find语句,其思路与if

2、语句类似.(3)问题求解: 方法一:for x=100:1:999 a=fix(x/100); b=fix(x/10-10*a); c=x-100*a-10*b; if x=a3+b3+c3 x endend 方法二:for x=1:1:9 for y=0:1:9 for z=0:1:9 if x3+y3+z3=100*x+10*y+z m=100*x+10*y+z end endendend 方法三:shui=100:999;i=floor(shui/100);j=floor(mod(shui,100)/10);k=floor(mod(shui,10);p=i.3+j.3+k.3;shui(

3、find(p=shui)(4)结论及分析: 通过实验,结果正确,证明分析无误.(5)结果: 153 370 371 4072.回文数(1)题目:对于一个自然数,若将各位数字倒序排出,加到原数字上,反复多次,若能得到一个从左到右读和从有到左读完全一样的数,则称该自然数能产生回文数.通过编程计算,你能找出多少个能产生回文数的数,又能找到多少不能产生回文数的数,二者的最小数是多少?(2)分析问题:本题关键在于如何将一个数的各个数位的数字倒序排出,并加到原数上.又由题目知必然要用到循环语句.(3)假设:由于将一个数的各个数位的数字倒序排出,并不断加到原数上比较困难,我们假设该数为四位数并假设倒序排出加

4、到原数得到的新数不超过10000,于是有了下面的简单程序for a=0:9; for b=0:9; for c=0:9; for d=0:9; x=1000*a+100*b+10*c+d; while x<10000; if a=d&b=c; x=x; else x=x+1000*d+100*c+10*b+a; end end end end x endend实际操作时,我们发现:该程序不仅具有假设中的缺陷,而且在实际操作中运行速度很慢,无法得到结果,所以必须将方法优化。后来我们使用取余和取整操作,借助循环语句while,得出如下程序,突破了本题的关键。for a=1:100 b

5、=0;c=0; x=a; while x>=10 b=mod(x,10); x=fix(x/10); c=10*c+b; end c=10*c+x;此程序实现了一个数的倒序操作,并不用考虑位数问题.(4)问题求解: for a=1:100c=0; x=a; while x>=10 b=mod(x,10); x=fix(x/10); c=10*c+b; end c=10*c+x; A=a+c; B=0; y=A; while y>=10 C=mod(y,10); y=fix(y/10); B=10*B+C; end B=10*B+y; while B=A A=A+B; m=0;

6、 z=A; while z>=10 n=mod(z,10); z=fix(z/10); m=10*m+n; end m=10*m+z; B=m; enda,Aend (5)结论及分析: 修改后的程序通过四个while循环语句完成了(1)数字的倒序排出(2)倒序排出数与原数无上界的不断相加(3)相加之和倒序、正序排列所得数的比较,得出了正确的的结果。运行速度较快.(6)结果: 最小的能产生回文数的数是1,100个数中找到了98个能产生回文数的数.其中89,98运算结果为:1.0e+012 * 1.0e+012 * 0.0000 8.8132 0.0000 8.8132它们是不能产生回文数的

7、数,则得到两个这样的数,最小的为89.(7)结论推广: 在命a的范围时,我们的范围是1到100,而事实上a可以任意取值,故可以通过国修改a的范围算出任意区间上的结果.3.完美数(1)题目: 对于一个数而言,若它的真因子之和等于数本身,则称该数为完美数。通过编程计算,你能找到多少个完美数。(2)分析问题:问题的关键在于找出一个数的真因子,通过使用mode命令可以找到其所有因子。然后利用for循环得到因子之和,最后用if语句使之与原数相等而导出结果。(3)假设:由于暂时没有想到得到真因子的方法,我们忽略了“真”字,于是得出下列程序:for a=1:1000; c=0; for b=1:1000;

8、if mod(a,b)=0; c=c+b; end end if c=a a endend结果只得了一个a=1. 于是我们改换思路,将以上程序中a除以b的商当做真因子并作了部分修改,得到了结果。在做亲和数实验时,为了将完美数从结果中去掉,我们添加了变量之间的不等命令。从中我们得到了启示,对以上程序添加了a>b命令,再次得到结果。(4)问题求解:方法一for a=1:1000; c=0; for b=1:1000; if mod(a,b)=0&a>b; c=c+b; end end if c=a a endend方法二for a=1:1000; s=0; for b=2:10

9、00; if mod(a,b)=0; c=a/b; s=s+c; end end if s=a s endend (5)结论及分析:通过对自己原来固有思维的大胆突破,我们得出了结果;通过对原来程序的修改,我们再次得到结果。修改后的程序运行较快,结果正确。(6)结果:一千以内的完美数有:6 ,28, 496(7)结论推广:程序中的a为1到1000,而a的取值可以时任意区间的自然数,可以通过修改a的范围得到其他结果。4.亲和数(1)题目:亲和数又叫友好数,是指两个自然数,其中每个自然数的真因数之和等于另一个数。通过编程计算,你能得到多少对亲和数。(2)分析问题:此题实际上是在完美数的基础上的一个拓

10、展,故其思想与完美数基本一样。(3)假设:我们假设亲和数可以是两个相同的完美数,于是将完美数的方法二分别用于两类数上,并进行了适当的修改,得出以下程序:for a=1:1000; x=0; for b=2:1000; if mod(a,b)=0; c=a/b; x=x+c; end end for l=1:1000 y=0; for m=2:1000; if mod(l,m)=0; n=l/m; y=y+n; end end if y=a&l=x; a,l end endend此程序有两大缺点:1、运行速度慢;2、没有将完美数排除在外。于是我们又做了些优化,将以上程序中的x直接取代l,

11、于是得出了运行较快的程序,而这样无疑是将运算范围缩小了一半。此外,我们添加了a=l命令,解决了第二个缺陷。同时这个命令使我们得到了启示,于是得出了完美数的方法一,也随即得出了亲和数的第三、四种方法。(4)问题求解:方法一for a=1:10000; x=0; for b=2:10000; if mod(a,b)=0; c=a/b; x=x+c; end end for l=1:10000 y=0; for m=2:10000; if mod(l,m)=0; n=l/m; y=y+n; end end if y=a&l=x&a=l; a,l end endend方法二for a=

12、1:20000; x=0; y=0; for b=2:20000; if mod(a,b)=0; c=a/b; x=x+c; end end for m=2:10000; if mod(x,m)=0; n=x/m; y=y+n; end end if y=a&a=x; a,x endend方法三for a=1:10000; c=0; for b=1:10000; if mod(a,b)=0&a>b; c=c+b; end end for x=1:10000; z=0; for y=1:10000; if mod(x,y)=0&x>y; z=z+y; end

13、end if c=x&z=a&x=a; a,x end endend方法四for a=1:10000; c=0; z=0; for b=1:10000; if mod(a,b)=0&a>b; c=c+b; end end for y=1:10000; if mod(c,y)=0&c>y; z=z+y; end end if a=z&a=c a,c endend(5)结论及分析:虽然4种方法都可得出结果,但通过优化的方法,明显缩短了运算时间。(6)结果:我们得出了10000以内的所有亲和数:220 284 284 220 1184 1210 1210 1184 2620 2924 2924 2620 5020 5564 5564 5020 6232 6368 6368 6232(7)结论推广:程序中的运算范围我们定为1到10000,但通过改变对变量的赋值范围,就可以得出其他更多的结果实验感想本次实验我们初步了解了MATLAB的使用方法,尤其对简单编程有了进一步的实践,并掌握了一些基本操作方法和编程思想。通过实验,电脑软件的强大功能让我们认识到了其对数学研究的重要性和必要性。由于第一次接触MATLAB,在实验过程中我们遇到了不少困难,但我们通过查阅书本、互相讨论、反复研究以及向学长、老师请教等途径将它们一一克服。尤

温馨提示

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

评论

0/150

提交评论