熱門文章

2026年3月28日 星期六

ZeroJudge 解題筆記:c203. 13185 - DPA Numbers I

作者:王一哲
日期: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;
}


沒有留言:

張貼留言