日期:2026年3月28日
ZeroJudge 題目連結:c203. 13185 - DPA Numbers I
解題想法
這題的測資很小,硬算就好。寫一個自訂函式 test 找 n 的所有因數和 $isum$,$isum$ 至少為 1,接下來從 $i = 2$ 開始往上測試到 $i = \sqrt{n}$ 為止,如果 $i$ 可以整除 $n$,則 $isum$ 加上 $i + (n/i)$;如果 $i^2 = n$,則 $isum$ 要再減去 $i$。最後比較 $isum$ 與 $n$ 的關係,輸出對應的答案。
Python 程式碼
使用時間約為 7 ms,記憶體約為 2.9 MB,通過測試。
def test(n):
isum = 1
for i in range(2, int(n**0.5) + 1):
if n%i == 0:
isum += i + n//i
if i*i == n:
isum -= i
if isum == n: return "perfect"
if isum < n: return "deficient"
return "abundant"
def solve():
import sys
result = []
data = sys.stdin.read().split()
ptr = 1
while ptr < len(data):
result.append(f"{test(int(data[ptr]))}\n")
ptr += 1
sys.stdout.write("".join(result))
if __name__ == "__main__":
solve()
C++ 程式碼
使用時間約為 0 ms,記憶體約為 76 kB,通過測試。
#include <cstdio>
#include <cmath>
void test(int n) {
int isum = 1;
for(int i=2; i<=(int)sqrt(n); i++) {
if (n%i == 0) {
isum += i + (n/i);
}
if (i*i == n) {
isum -= i;
}
}
if (isum == n) {
puts("perfect");
return;
}
if (isum < n) {
puts("deficient");
return;
}
puts("abundant");
}
int main() {
int t; scanf("%d", &t);
for(int i=0; i<t; i++) {
int n; scanf("%d", &n);
test(n);
}
return 0;
}
沒有留言:
張貼留言