熱門文章

2026年4月23日 星期四

ZeroJudge 解題筆記:d182. 00256 - Quirksome Squares

作者:王一哲
日期:2026年4月23日


ZeroJudge 題目連結:d182. 00256 - Quirksome Squares

解題想法


假設位數為 $n$,題目要找的答案只有可能是 $i = 0, 1, 2, \dots, 98, 10^{n/2} - 1$ 的平方,將 $i^2$ 的左、右兩半加起來,再檢查組合後的數平方是否等於 $i^2$,就可以找到答案。

Python 程式碼


使用時間約為 26 ms,記憶體約為 8.5 MB,通過測試。
def solve():
    import sys

    result = []
    data = sys.stdin.read().split()
    ptr = 0
    while ptr < len(data):
        n = int(data[ptr])
        ptr += 1
        m = 10**(n//2)  # 上限,10 的 n/2 次方
        for i in range(m):
            square = i*i  # 平方
            num = square//m + square%m  # 左、右兩半相加
            if num**2 == square:  # 符合條件
                ans = str(square).zfill(n)  # 前方補 0 至 n 位數
                result.append(f"{ans}\n")
    sys.stdout.write("".join(result))

if __name__ == "__main__":
    solve()


C++ 程式碼


使用時間約為 0 ms,記憶體約為 1.5 MB,通過測試。
#include <cstdio>

int main() {
    int n;  // 位數
    while(scanf("%d", &n) != EOF) {
        int m = 1;  // 上限,10 的 n/2 次方
        for(int i=0; i<n/2; i++) m *= 10;
        for(int i=0; i<m; i++) {  // 測試 i = 0 ~ m-1
            int square = i*i;  // i 平方
            int num = square/m + square%m;  // i 平方左、右相加
            if (num*num == square) {  // num 平方如果等於 square
                if (square < 10) {  // 答案前面要補 0 至 n 位數
                    for(int j=0; j<n-1; j++) printf("0");
                    printf("%d\n", square);
                } else if (square < 1000) {
                    for(int j=0; j<n-3; j++) printf("0");
                    printf("%d\n", square);
                } else if (square < 100000) {
                    for(int j=0; j<n-5; j++) printf("0");
                    printf("%d\n", square);
                } else if (square < 10000000) {
                    for(int j=0; j<n-7; j++) printf("0");
                    printf("%d\n", square);
                } else {
                    printf("%d\n", square);
                }
            }
        }
    }
    return 0;
}


沒有留言:

張貼留言