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

C 語言數學問題求解:完全平方數條件下的整數查找 (x+100 和 x+268 均為完全平方數)

     編輯:關於C語言

問題描述

找出小於 100,000 的整數 x,使得:

  • x + 100 是完全平方數:x + 100 = n²
  • x + 268 是完全平方數:x + 268 = m² (原題 168+100=268)

核心考點:數學建模轉化、平方數判斷、枚舉優化。

原代碼分析:暴力枚舉 1 到 100,000


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

int main() {
    int i, n, m, count = 0, results[100];
    for (i = 1; i < 100000; i++) {
        n = sqrt(100 + i);
        m = sqrt(268 + i);
        if (n*n == 100+i && m*m == 268+i) {
            results[count++] = i;
        }
    }
    printf("符合條件的數有 %d 個:\n", count);
    for (i = 0; i < count; i++) printf("%d\n", results[i]);
    return 0;
}

數學建模優化:差分平方數結構

由題意得:

m² - n² = (x+268) - (x+100) = 168
(m-n)(m+n) = 168

設 a = m-n, b = m+n,則:

  • a × b = 168
  • a, b 同奇偶 (因 m,n 為整數,m+n 和 m-n 同奇偶)
  • b > a > 0
  • m = (a+b)/2, n = (b-a)/2
  • x = n² - 100

優化算法:枚舉因子對 (168 的因數分解)


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

int main() {
    int target = 168;
    int count = 0;

    // 枚舉 a 從 1 到 sqrt(168)
    for (int a = 1; a * a <= target; a++) {
        if (target % a != 0) continue;
        int b = target / a;

        // a, b 同奇偶
        if ((a % 2) != (b % 2)) continue;

        int m = (a + b) / 2;
        int n = (b - a) / 2;
        int x = n * n - 100;

        if (x > 0 && x < 100000) {
            printf("x = %d (n=%d, m=%d, a=%d, b=%d)\n", x, n, m, a, b);
            count++;
        }
    }
    printf("共 %d 個解\n", count);
    return 0;
}

因子對枚舉過程

ab=168/a同奇偶?mnx=n²-100有效?
1168否 (奇/偶)---✗
284是 (偶/偶)43411581✓
356否---✗
442是2319261✓
628是171121✓
724否---✗
821否---✗
1214是131-99✗ (x≤0)

最終解

滿足條件的正整數 x < 100,000 共有 3 個:

  1. x = 21:21+100=121=11²,21+268=289=17²
  2. x = 261:261+100=361=19²,261+268=529=23²
  3. x = 1581:1581+100=1681=41²,1581+268=1849=43²

複雜度對比

總結

完全平方數差值問題展示了代數變換將 O(N) 暴力降為 O(√D) 解析解的威力。關鍵收穫:

  • 平方數差恒等式:m² - n² = (m-n)(m+n);
  • 因子對枚舉需同奇偶性約束;
  • 暴力枚舉雖簡單但可接受 (10萬級),數學建模是昇華;
  • sqrt 浮點轉整數判斷平方數需警惕精度:n = (int)sqrt(val); if (n*n == val) 是安全模式;
  • 類似問題:找 x 使 x+a, x+b 均為平方數 → 核心解 |b-a| 的因子對。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法迭代次數時間複雜度核心思想
暴力枚舉 x100,000O(N)直接檢查定義
枚舉 n (√x)~316O(√N)n² = x+100 → x = n²-100
因子分解 (最優)~12O(√D) (D=差值)代數結構 m²-n² = D