首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言求完數 (Perfect Number) 完整解法:因子和函數與多組測試數據處理

     編輯:C 語言問答

定義

**完數** = 真因子 (不含自身) 之和等於自身。如 6 (1+2+3)、28 (1+2+4+7+14)。

因子和函數優化


int factor_sum(int n) {
    if (n <= 1) return 0;
    int sum = 1;  // 1 永遠是因子
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            sum += i;
            if (i != n / i) sum += n / i;  // 避免平方數重複加
        }
    }
    return sum;
}
  • 只遍歷到 sqrt(n),成對累加,複雜度 O(sqrt(n))。
  • n=1 無真因子,和為 0。

主程式:多組測試數據、區間輸出


#include <stdio.h>

int factor_sum(int n);

int main() {
    int m, n;
    while (1) {
        printf("請輸入 m n (m>=1, n<=1000, m<=n),輸入 0 0 結束:");
        if (scanf("%d %d", &m, &n) != 2) break;
        if (m == 0 && n == 0) break;
        if (m < 1 || n > 1000 || m > n) {
            puts("輸入範圍錯誤");
            continue;
        }

        int found = 0;
        for (int i = m; i <= n; i++) {
            if (i == factor_sum(i)) {
                printf("%d ", i);
                found = 1;
            }
        }
        if (!found) printf("無完數");
        putchar('\n');
    }
    return 0;
}

1000 以內完數列表


6, 28, 496
// 下一個 8128 > 1000

數學拓展

  • 歐幾里得證明:2^(p-1) * (2^p - 1) 為完數,若 2^p - 1 為梅森素數。
  • 已知 51 個完數 (2023),皆為偶數,**奇完數是否存在為未解猜想**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved