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

經典數學題:一整數加 100 後為完全平方數,再加 168 仍為完全平方數,求該數

     編輯:關於C語言

問題建模與數學轉化

設該整數為 x。根據題意:

  • x + 100 = a² (a 為整數)
  • x + 268 = b² (b 為整數,因 100+168=268)

兩式相減得:b² - a² = 168,即 (b - a)(b + a) = 168。

因式分解窮舉法

設 m = b - a, n = b + a,則 m * n = 168,且 m, n 同奇偶(因 b = (m+n)/2, a = (n-m)/2 需為整數)。

168 的因數對(同奇偶):

mna=(n-m)/2b=(m+n)/2x=a²-100
28441431581
4421923261
628111721
1214113-99

驗證結果

  • x = 21:21+100=121=11²;21+268=289=17² ✓
  • x = 261:261+100=361=19²;261+268=529=23² ✓
  • x = 1581:1581+100=1681=41²;1581+268=1849=43² ✓
  • x = -99:-99+100=1=1²;-99+268=169=13² ✓(負整數亦滿足條件)

C 語言暴力求解實現(教學演示)

#include <stdio.h>
#include <math.h>

int main() {
    long int i, x, y;
    printf("滿足條件的整數有:\n");
    for (i = -100000; i <= 100000; i++) { // 擴展到負數範圍
        x = sqrt(i + 100);
        y = sqrt(i + 268);
        // 判斷完全平方數:開方後平方等於原數
        if (x * x == i + 100 && y * y == i + 268) {
            printf("%ld ", i);
        }
    }
    printf("\n");
    return 0;
}

運行輸出

滿足條件的整數有:
-99 21 261 1581

算法優化思路

  1. 數學法 O(1):直接因式分解 168,如上表所示,無需遍歷。
  2. 優化遍歷範圍:由 b² - a² = 168 可知 b > a ≥ 0,遍歷 a 即可,計算 b² = a² + 168 判斷是否為完全平方數,範圍縮減至 sqrt(MAX)。
  3. 整數開方優化:避免浮點 sqrt 精度問題,可用二分查找或牛頓法實現整數開方。

總結

本題核心在於將「完全平方數」條件轉化為平方差因式分解模型。數學解法優於暴力枚舉,體現了「化繁為簡」的算法思想。C 語言實現時需注意 sqrt 浮點精度陷阱,工程中推薦使用整數運算判斷完全平方數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved