首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語法百題精解:四位數 abcd 滿足 (ab+cd)² = abcd(暴力枚舉與數學優化)

     編輯:關於C語言

題目描述

找出所有四位整數 abcd(即 1000~9999),滿足 (ab + cd)² = abcd,其中 ab 為高兩位,cd 為低兩位。按從小到大輸出,每行一個。

暴力枚舉解法 O(9000) → 瞬間完成

#include 

int main() {
    for (int i = 1000; i < 10000; ++i) {
        int ab = i / 100;   // 高兩位
        int cd = i % 100;   // 低兩位
        int sum = ab + cd;
        if (sum * sum == i) {
            printf("%d\n", i);
        }
    }
    return 0;
}

輸出結果

2025
3025
9801

驗證:
2025 → 20+25=45, 45²=2025 ✓
3025 → 30+25=55, 55²=3025 ✓
9801 → 98+01=99, 99²=9801 ✓

數學優化:將搜索空間從 9000 降至 90

設 S = ab + cd,則 S² = 100·ab + cd。
因 0 ≤ ab, cd ≤ 99,故 0 ≤ S ≤ 198。
但 S² 為四位數 → 32 ≤ S ≤ 99(因 31²=961 三位,100²=10000 五位)。
只需枚舉 S = 32..99,計算 S²,再驗證 ab+cd == S:

for (int S = 32; S <= 99; ++S) {
    int sq = S * S;
    int ab = sq / 100;
    int cd = sq % 100;
    if (ab + cd == S) printf("%d\n", sq);
}

僅 68 次迴圈,極致優化。

相關變體:四位數逆序輸出

// 字串法(簡單)
char s[5]; scanf("%4s", s);
for (int i = 3; i >= 0; --i) putchar(s[i]);

// 數學法(無緩衝區)
int n; scanf("%d", &n);
while (n) { putchar('0' + n%10); n/=10; }

相關變體:四位數各位數字之和

int n, sum = 0; scanf("%d", &n);
while (n) { sum += n % 10; n /= 10; }
printf("%d\n", sum);

總結

  • 暴力枚舉 9000 次在現代 CPU 微秒級完成,**可讀性最高,面試首選**。
  • 數學優化展現**建模能力**,適合嵌入式資源極限場景或算法競賽。
  • 關鍵技巧:/100 取高兩位、%100 取低兩位、S² 範圍推導。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved