当前位置:文档之家› 用Matlab求水仙花数,完美数,回文数和亲合数

用Matlab求水仙花数,完美数,回文数和亲合数

题目:对深圳市人口及医疗的预测编号: 10055队长李荣姓名: 李荣(09041117)王遂(09041124)李春晓(09055025)1.水仙花数:(1)题目若一个三位数自然数的各位数的各位数字的立方和等于该数本身,则称该数为水仙花数,例如,153=1^3+5^3+3^3,所以153为水仙花数,编程计算所有水仙花数.(2)分析问题:本题特点在于一个数的各个位数立方和与其本身的关系很明确且很简单,可以用if语句或find语句来完成.如果用if语句,则又有两种选择:1.命一个三位数,再表示其各个位数的数字;2.命各个位数的数字,再表示该三位数.如果用find语句,其思路与if语句类似.(3)问题求解:方法一:for x=100:1:999a=fix(x/100);b=fix(x/10-10*a);c=x-100*a-10*b;if x==a^3+b^3+c^3xendend方法二:for x=1:1:9for y=0:1:9for z=0:1:9if x^3+y^3+z^3==100*x+10*y+zm=100*x+10*y+zendendendend方法三: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(find(p==shui))(4)结论及分析:通过实验,结果正确,证明分析无误.(5)结果:153 370 371 4072.回文数(1)题目:对于一个自然数,若将各位数字倒序排出,加到原数字上,反复多次,若能得到一个从左到右读和从有到左读完全一样的数,则称该自然数能产生回文数.通过编程计算,你能找出多少个能产生回文数的数,又能找到多少不能产生回文数的数,二者的最小数是多少?(2)分析问题:本题关键在于如何将一个数的各个数位的数字倒序排出,并加到原数上.又由题目知必然要用到循环语句.(3)假设:由于将一个数的各个数位的数字倒序排出,并不断加到原数上比较困难,我们假设该数为四位数并假设倒序排出加到原数得到的新数不超过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;elsex=x+1000*d+100*c+10*b+a;endendendendxendend实际操作时,我们发现:该程序不仅具有假设中的缺陷,而且在实际操作中运行速度很慢,无法得到结果,所以必须将方法优化。

后来我们使用取余和取整操作,借助循环语句while,得出如下程序,突破了本题的关键。

for a=1:100b=0;c=0;x=a;while x>=10b=mod(x,10);x=fix(x/10);c=10*c+b;endc=10*c+x;此程序实现了一个数的倒序操作,并不用考虑位数问题.(4)问题求解:for a=1:100c=0;x=a;while x>=10b=mod(x,10);x=fix(x/10);c=10*c+b;endc=10*c+x;A=a+c;B=0;y=A;while y>=10C=mod(y,10);y=fix(y/10);B=10*B+C;endB=10*B+y;while B~=AA=A+B;m=0;z=A;while z>=10n=mod(z,10);z=fix(z/10);m=10*m+n;endm=10*m+z;B=m;end[a,A]end(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它们是不能产生回文数的数,则得到两个这样的数,最小的为89..(7)结论推广:在命a的范围时,我们的范围是1到100,而事实上a可以任意取值,故可以通过国修改a的范围算出任意区间上的结果.3.完美数(1)题目:对于一个数而言,若它的真因子之和等于数本身,则称该数为完美数。

通过编程计算,你能找到多少个完美数。

(2)分析问题:问题的关键在于找出一个数的真因子,通过使用mode命令可以找到其所有因子。

然后利用for循环得到因子之和,最后用if语句使之与原数相等而导出结果。

(3)假设:由于暂时没有想到得到真因子的方法,我们忽略了“真”字,于是得出下列程序:for a=1:1000;c=0;for b=1:1000;if mod(a,b)==0;c=c+b;endendif c==aaendend结果只得了一个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;endendif c==aaendend方法二for a=1:1000;s=0;for b=2:1000;if mod(a,b)==0;c=a/b;s=s+c;endendif s==asendend(5)结论及分析:通过对自己原来固有思维的大胆突破,我们得出了结果;通过对原来程序的修改,我们再次得到结果。

修改后的程序运行较快,结果正确。

(6)结果:一千以内的完美数有:6 ,28, 496(7)结论推广:程序中的a为1到1000,而a的取值可以时任意区间的自然数,可以通过修改a的范围得到其他结果。

4.亲和数(1)题目:亲和数又叫友好数,是指两个自然数,其中每个自然数的真因数之和等于另一个数。

通过编程计算,你能得到多少对亲和数。

(2)分析问题:此题实际上是在完美数的基础上的一个拓展,故其思想与完美数基本一样。

(3)假设:我们假设亲和数可以是两个相同的完美数,于是将完美数的方法二分别用于两类数上,并进行了适当的修改,得出以下程序:for a=1:1000;x=0;for b=2:1000;if mod(a,b)==0;c=a/b;x=x+c;endendfor l=1:1000y=0;for m=2:1000;if mod(l,m)==0;n=l/m;y=y+n;endendif y==a&l==x;[a,l]endendend此程序有两大缺点:1、运行速度慢;2、没有将完美数排除在外。

于是我们又做了些优化,将以上程序中的x直接取代l,于是得出了运行较快的程序,而这样无疑是将运算范围缩小了一半。

此外,我们添加了a~=l命令,解决了第二个缺陷。

同时这个命令使我们得到了启示,于是得出了完美数的方法一,也随即得出了亲和数的第三、四种方法。

(4)问题求解:方法一for a=1:10000;x=0;for b=2:10000;if mod(a,b)==0; c=a/b;x=x+c;endendfor l=1:10000y=0;for m=2:10000;if mod(l,m)==0; n=l/m;y=y+n;endendif y==a&l==x&a~=l; [a,l]endendend方法二for a=1:20000;x=0;y=0;for b=2:20000;if mod(a,b)==0; c=a/b;x=x+c;endendfor m=2:10000;if mod(x,m)==0; n=x/m;y=y+n;endendif 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;endendfor x=1:10000;z=0;for y=1:10000;if mod(x,y)==0&x>y; z=z+y;endendif c==x&z==a&x~=a;[a,x]endendend方法四for a=1:10000;c=0;z=0;for b=1:10000;if mod(a,b)==0&a>b; c=c+b;endendfor y=1:10000;if mod(c,y)==0&c>y; z=z+y;endendif a==z&a~=c[a,c]endend(5)结论及分析:虽然4种方法都可得出结果,但通过优化的方法,明显缩短了运算时间。

(6)结果:我们得出了10000以内的所有亲和数:220 284284 2201184 12101210 11842620 29242924 26205020 55645564 50206232 63686368 6232(7)结论推广:程序中的运算范围我们定为1到10000,,但通过改变对变量的赋值范围,就可以得出其他更多的结果实验感想本次实验我们初步了解了MATLAB的使用方法,尤其对简单编程有了进一步的实践,并掌握了一些基本操作方法和编程思想。

通过实验,电脑软件的强大功能让我们认识到了其对数学研究的重要性和必要性。

由于第一次接触MATLAB,在实验过程中我们遇到了不少困难,但我们通过查阅书本、互相讨论、反复研究以及向学长、老师请教等途径将它们一一克服。

尤其是我们的团结协作,在此体现得非常明显,很多问题都是在大家不断的商量与完善中才得出的结果。

而对于同一个的问题,每个人通常都会有不同的看法,在不断的对比与优化中我们才逐渐得到比较好的程序。

另外在实验报告的完成过程中,大家各尽所长。

这次试验使我们更加清楚的认识到团结合作的重要性。

在今后的学习中,我们要更认真地学习MATLAB,使之成为我们学习数学和日后进行研究的好帮手;同时,我们要更加重视团队合作,取长补短,精益求精。

2009年12月23日。

相关主题