C语言———求”完数“
生活随笔
收集整理的這篇文章主要介紹了
C语言———求”完数“
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個數如果恰好等于它的因子之和,這個數就稱為 "完數 "。例如6=1+2+3,編程找出1000以內的所有完數。
分析過程
- 所謂完數,就是其因子之和(不包括自己本身)等于其本身,稱其為完數;
- 解決此題,我們需要將每個數逐個進行判斷,如果條件符合,我們打印其因子就OK啦!
- 兼顧到程序時間復雜度,我們只需要判斷**“1到該數的平方根”**就OK啦,但是我們需要將在此范圍內對應的另一個因子算出來,即用原數除以此范圍中該數的因子。比如題目中給出的6是完數,但是6的平方根為2(我們用轉化為int類型),但是我們都知道3也是6的因子,但是3又不在我們給出的范圍【1,2】,我們只需要用6/2即可得到它。
- 這樣做完我們在判斷因子之和的時候,需要減去其本身一次,因為1是每個數的因子么,但是我們又求出了它的另一半,這又不符合完數的定義,所以我們在此必須減去其本身一次,即可得到正解!做到這一步,我們基本上就可以很容易的把代碼寫出來了!
代碼展示
#include<stdio.h> #include<stdlib.h> #include<math.h> #define M 1000int main() {int i,j;for(i=2;i<M;i++){ int sum=0;for(j=1;j<=sqrt(i);j++){if((i%j)==0){sum=sum+j+(i/j);}}//判斷是否為完全數,如果是,則打印其因子 if(i==sum-i){printf("%d is factors number: ",i);for(j=1;j<i;j++){ if(i%j==0)printf("%d ",j);} printf("\n");} }return 0; }運行結果展示
程序反思
小編對此代碼的時間復雜度較為滿意的,剛開始小編是從1到 i-1 來求其因子的,這樣光判斷是否為合數時間復雜度就已經基本為M^M了,小編這個代碼的時間復雜度為M*sqrt(M),相比起前者,時間復雜度得到了更好的優化。大家可以將M的值給到100000就能很清楚的感受到了。
因為時間原因,后期小編再為大家提供另一種解決思路,今天舉出來的解法時間復雜度還是有點大,我們應該尋找更優的解法,大家也可以留言談談你對此題的高見!歡迎大家批評留言及討論!
總結
以上是生活随笔為你收集整理的C语言———求”完数“的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Typescript学习;Typescr
- 下一篇: typescript+react+ant