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