用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

提交評論