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...