日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言———求”完数“

發(fā)布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。