首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言完全平方數判斷:浮點精度陷阱與正確整數算法

     編輯:程式設計疑難解答

原代碼問題

y = sqrt(x + 100);
z = sqrt(x + 268);
if ((y * y == x + 100) && (z * z == x + 268)) // 浮點比較不可靠

`sqrt` 返回 `double`,浮點運算存在誤差,`y*y` 可能不精確等於整數,導致判斷失效。

正確整數判斷法

int isPerfectSquare(int n) {
    int r = (int)(sqrt(n) + 0.5); // 四捨五入取整
    return r * r == n;
}

完整優化程式

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

int isPerfectSquare(int n) {
    int r = (int)(sqrt(n) + 0.5);
    return r * r == n;
}

int main() {
    for (int x = 1; x < 100000; x++) {
        if (isPerfectSquare(x + 100) && isPerfectSquare(x + 268)) {
            printf("%d\n", x);
            break; // 題目通常只有一解
        }
    }
    return 0;
}

數學優化 (可選)

設 x + 100 = a², x + 268 = b² → b² - a² = 168 → (b-a)(b+a) = 168。枚舉 168 的因子對即可 O(√168) 求解,無需暴力循環 10 萬次。

輸出結果

21

驗證:21+100=121=11²,21+268=289=17²。

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