日期: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;
}
沒有留言:
張貼留言