382 Perfection

題目連結

題目敘述

根據 1994 年 Microsoft Encarta 的數論條目:

  • 若 a, b, c 為整數,且 a = b / c,則稱 a 是 b or c 的倍數,b or c 是 a 的因數(除數)。
  • 若因數不為 1,則稱為「真因數」(proper divisor)。
  • 偶數(包含 0)都是 2 的倍數,例如 -4, 0, 2, 10;奇數則是不為偶數的整數,例如 -5, 1, 3, 9。
  • 完美數(perfect number)指正整數,且等於其所有正真因數之和;例如 6(1+2+3)和 28(1+2+4+7+14)都是完美數。
  • 若正整數不是完美數,則稱為「不完美數」(imperfect);若真因數之和小於該數,稱為「不足數」(deficient),若大於該數,稱為「過剩數」(abundant)。

輸入格式

  • 多筆正整數,皆不超過 60000。
  • 以單獨一個 0 作為結束標記(不處理此行)。
  • 總筆數 1 < N < 100。

輸出格式

首行輸出:

PERFECTION OUTPUT

接下來對每個輸入的正整數 n,依序輸出一行,格式為:

    n  DESCRIPTION
  • n 右對齊佔 5 個字元(含空格),
  • 之後兩個空格,
  • DESCRIPTION 為 PERFECTDEFICIENTABUNDANT

最後輸出:

END OF OUTPUT

解題思路

找出 1 ~ n-1 中能夠整除 n 的數字 i,稱 i 為 n 的因數
將所有的 i 進行相加,對其總和與數字 n 進行比較

  • 總和 > n,n 為 Abundant
  • 總和 < n,n 為 Deficient
  • 總和 == n,n 為 Perfect

程式碼

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cout << "PERFECTION OUTPUT\n"; // 按照題目要求格式輸出
    while (cin >> n, n) {
        int sum = 0;
        cout << setw(5) << n << "  "; // 按照題目要求格式輸出
        for (int i = 1; i < n; i++) if (!(n%i)) sum += i; // 計算因數總和
        if (sum == n) cout << "PERFECT\n"; // 進行總和與 n 的比較,並輸出結果
        else if (sum < n) cout << "DEFICIENT\n";
        else cout << "ABUNDANT\n";
    }
    cout << "END OF OUTPUT\n";
}