C 經典演算法題完美數 - w3c學習教程
文章推薦指數: 80 %
C 經典演算法題完美數,如果有一數n,其真因數proper factor 的總和等於n,則稱之為完美數perfect number , 例如以下幾個數都是完美數.
C經典演算法題完美數
2021-10-0206:18:13字數1759閱讀1398
如果有一數n,其真因數(properfactor)的總和等於n,則稱之為完美數(perfectnumber),例如以下幾個數都是完美數:
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
程式基本上不難,第一眼看到時會想到使用迴圈求出所有真因數,再進一步求因數和,不過若n值很大,則此法會花費許多時間在迴圈測試上,十分沒有效率,例如求小於10000的所有完美數。
如何求小於10000的所有完美數?並將程式寫的有效率?基本上有三個步驟:
求出一定數目的質數表
利用質數表求指定數的因式分解
利用因式分解求所有真因數和,並檢查是否為完美數
步驟一與步驟二在之前討論過了,問題在步驟三,如何求真因數和?方法很簡單,要先知道將所有真因數和加上該數本身,會等於該數的兩倍,例如:
2*28=1+2+4+7+14+28
等式後面可以化為:
2*28=(20+21+22)*(70+71)
所以只要求出因式分解,就可以利用迴圈求得等式後面的值,將該值除以2就是真因數和了;等式後面第一眼看時可能想到使用等比級數公式來解,不過會使用到次方運算,可以在迴圈走訪因式分解陣列時,同時計算出等式後面的值,這在下面的實作中可以看到。
#include
#include
#definen1000
#definep10000
intprime
(int*)
;//求質數表
intfactor
(int*,
int,
int*);
//求factor
intfsum
(int*,
int)
;//sumotproperfactor
intmain
(void);
//儲存質數表
intfact[n+1]
=;//儲存因式分解結果
intcount1,count2,i;count1=
prime
(ptable)
;for
(i=
0;i<=p;i++
)printf
("\n");
return0;
}int
prime
(int
*pnum)}}
for(i=
2,j=
0;i
延伸文章資訊
- 1C語言求完數(完全數)(詳解版) - tw511教學網
演算法設計. 對於這類求某一範圍(由於本題範圍不固定,在程式設計過程中採用鍵盤輸入的方式)內滿足條件的數時,一般釆用遍歷的方式,對給定範圍內的 ...
- 2完美數的演算法設計(C語言) - IT閱讀
尋找1~10000之間的完美的數。 法一程式程式碼如下: #include<stdio.h> int fun_perfect(int number) { int i,sum=0 ...
- 3完全數- 維基百科,自由的百科全書
完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數:它所有的真因子(即除了自身以外的因數)的和,恰好等於它本身,完全數不可能是楔形數、平方數、 ...
- 4完美數演算法
完美數的演算法設計(C語言) – IT閱讀. 完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。. 它所有的真因子(即除了自身以外的約數)的和(即因子 ...
- 5C 經典演算法題完美數 - w3c學習教程
C 經典演算法題完美數,如果有一數n,其真因數proper factor 的總和等於n,則稱之為完美數perfect number , 例如以下幾個數都是完美數.