完數(完全數):等於其所有真因子(不含自身)之和的自然數。
例子:6 = 1+2+3,28 = 1+2+4+7+14,496,8128...
#include
#include
int is_perfect(int n) {
if (n <= 1) return 0;
int sum = 1; // 1 是所有 n>1 的因子
int limit = (int)sqrt(n);
for (int i = 2; i <= limit; i++) {
if (n % i == 0) {
sum += i;
int paired = n / i;
if (paired != i) sum += paired; // 避免平方數重複加
}
}
return sum == n;
}
int main() {
int n;
printf("輸入正整數: ");
scanf("%d", &n);
if (is_perfect(n))
printf("%d 是完數\n", n);
else
printf("%d 不是完數\n", n);
return 0;
}
| 方法 | 時間複雜度 | 適用範圍 |
|---|---|---|
| 暴力 1~n-1 | O(n) | n < 10^5 可接受 |
| √n 優化 | O(√n) | n < 10^12 秒級 |
| 梅森素數公式 | O(1) 查表 | 已知 51 個完數全為偶數,形式 2^(p-1)*(2^p-1) |