C 實現求解完美數演算法

2021-09-10 09:44:59 字數 1530 閱讀 3705

1.問題

如果有一數n ,其真因數 (proper factor ) 的總和等於n , 則稱之為完美數(perfect number ),例如以下幾個數都是完美數: 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 程式基本上不難,第一眼看到時會想到使用迴圈求出所有真因數,再進一步求因數和,不過若n值很大,則此法會花費許多時間在迴圈測試上,十分 沒有效率,例如求小於10000的所有完美數 。

2.實現思路

如何求小於10000的所有完美數?並將程式寫的有效率?基本上有三個步驟:

1.求出一定數目的質數表

2.利用質數表求指定數的因式分解

3.利用因式分解求所有真因數和,並檢查是否為完美數

步驟一 與 步驟二 在之前討論過了,問題在步驟三,如何求真因數和?方法很簡單,要先知道將所有真因數和加上該數本身,會等於該數的兩倍,

例如:2 * 28 = 1 + 2 + 4 + 7 + 14 + 28

等式後面可以化為:

2 * 28 = (2^0 + 2^1 + 2^2) * (7^0 + 7^1 )

所以只要求出因式分解,就可以利用迴圈求得等式後面的值,將該值除以2就是真因數和了;等式後面第一眼看時可能想到使用等比級數公式來解,不

過會使用到次方運算,可以在迴圈走訪因式分解陣列時,同時計算出等式後面的值,這在下面的實作中可以看到

3.**實現

#include #include #define n 1000

#define p 10000

int prime(int*); // 求質數表

int factor(int*, int, int*); // 求factor

int fsum(int*, int); // sum ot proper factor

int main(void) ; // 儲存質數表

int fact[n+1] = ; // 儲存因式分解結果

int count1, count2, i;

count1 = prime(ptable);

for(i = 0; i <= p; i++)

printf("\n");

return 0;

}int prime(int* pnum) }}

for(i = 2, j = 0; i < n; i++)

return j;

}int factor(int* table, int num, int* frecord)

else

i++;

}frecord[k] = num;

return k+1;

}int fsum(int* farr, int c) while(i < c-1 && farr[i-1] == farr[i]);

s *= q;

r = 1;

q = 1;

}return s / 2;

}

完美數的演算法設計(C語言)

完全數 perfect number 又稱完美數或完備數,是一些特殊的自然數。它所有的真因子 即除了自身以外的約數 的和 即因子函式 恰好等於它本身。如果乙個數恰好等於它的因子之和,則稱該數為 完全數 尋找完美的數 題目描述 所謂完美的數是這個數除了它自身之外,所有因子的和等於該數。例如 28,其因...

C 孿生數求解

孿生數定義 如果a的約數 因數,包含1,但不包含a本身 之和等於b,b的約數 因數 之和等於a,a和b稱為孿生數 a和b不相等 試找出正整數m和n之間的攣生數。從控制台輸入兩個正整數m和n 1 m在標準輸出上輸出符合題目描述的m和n之間的全部攣生數對 包括m和n 每行輸出一對孿生數,用乙個空格隔開,...

動態規劃 數塔問題求解 C 實現

file name digital tower.cpp function 動態規劃 數塔問題求解 c 實現 created on 2016年6月17日 author beijiwei qq.com 任何單位和個人不經本人允許不得用於商業用途 912 15 10 6 8 2 18 9 5 19 7 1...