開啟章節選單
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 為
PERFECT
、DEFICIENT
或ABUNDANT
。
最後輸出:
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"; }