熱門文章

2026年2月1日 星期日

ZeroJudge 解題筆記:c032. 00382 - Perfection

作者:王一哲
日期:2026年2月1日


ZeroJudge 題目連結:c032. 00382 - Perfection

解題想法


注意,實際上有多行測資。我是用試除法找 $n$ 的因數,將所有的因數儲存在集合之中。最後再比較所有的因數加總 $isum$ 與 $n$ 的大小,輸出對應的答案。

Python 程式碼


使用時間約為 17 ms,記憶體約為 3.3 MB,通過測試。
import sys

def test(n):
    if n == 1: return "DEFICIENT"
    factors = {1}
    for i in range(2, int(n**0.5)+1):
        if n%i == 0:
            factors.add(i)
            factors.add(n//i)
    isum = sum(factors)
    if isum == n:
        return "PERFECT"
    elif isum < n:
        return "DEFICIENT"
    else:
        return "ABUNDANT"

print("PERFECTION OUTPUT")
for line in sys.stdin:
    for n in map(int, line.split()):
        if n == 0: continue
        print(f"{n:5d}  {test(n):s}")
print("END OF OUTPUT")


C++ 程式碼


使用時間約為 2 ms,記憶體約為 320 kB,通過測試。
#include <iostream>
#include <string>
#include <set>
#include <cmath>
#include <iomanip>
using namespace std;

string test(int n) {
    if (n == 1) return "DEFICIENT";
    set<int> factors = {1};
    for(int i=2; i<=int(sqrt(n)); i++) {
        if (n%i == 0) {
            factors.insert(i);
            factors.insert(n/i);
        }
    }
    int isum = 0;
    for(int it : factors) isum += it;
    if (isum == n) return "PERFECT";
    else if (isum < n) return "DEFICIENT";
    else return "ABUNDANT";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cout << "PERFECTION OUTPUT\n";
    int n;
    while(cin >> n) {
        if (n == 0) continue;
        cout << setw(5) << n << "  " << test(n) << "\n";
    }
    cout << "END OF OUTPUT\n";
    return 0;
}


沒有留言:

張貼留言