python经典100题目之求完全平方数

这道题可以通过暴力枚举来求解,也可以通过数学方法进行求解。

先来看暴力枚举的解法:

import math

for i in range(1, 100000):
    x = int(math.sqrt(i + 100))
    y = int(math.sqrt(i + 268))
    if x * x == i + 100 and y * y == i + 268:
        print(i)

代码解释:

  1. 首先用 math 库中的 sqrt() 函数求出 i+100i+268 的平方根,因为这两个数都是完全平方数。

  2. 判断 i+100i+268 是否都是完全平方数,如果是,将 i 输出。

这个代码的缺点在于枚举了一万次才求出正确答案。接下来,我们来看数学方法。

解法:

设该整数为 $x$,则有:

$(\sqrt{x+100})^2 - 100 = x$

$(\sqrt{x+268})^2 - 268 = x$

移项可得:

$(\sqrt{x+100})^2 - x = 100$

$(\sqrt{x+268})^2 - x = 268$

由于 $x$ 是整数,所以 $(\sqrt{x+100})^2 - x$ 和 $(\sqrt{x+268})^2 - x$ 都是整数,因此 $\sqrt{x+100}$ 和 $\sqrt{x+268}$ 都是整数。

设 $\sqrt{x+100} = m$,$\sqrt{x+268} = n$,则有:

$m^2 - x = 100$

$n^2 - x = 268$

联立这两个方程可以得到:

$n^2 - m^2 = 168$

因为 $168 = 2^3 \times 3 \times 7$,所以 $n^2 - m^2$ 只能是以下两种情况之一:

$n + m = 168$,$n - m = 1$

$n + m = 84$,$n - m = 2$

解得:

$n = 85$,$m = 83$,$x = m^2 - 100 = 6889$

因此,该数为 6889。

代码实现:

import math

m = 1
while True:
    n = int(math.sqrt(168 + m * m))
    if n * n == 168 + m * m:
        x = n * n - 100
        if int(math.sqrt(x + 268)) ** 2 == x + 268:
            print(x)
            break
    m += 1

代码解释:

  1. 首先枚举 $m$,因为 $n$ 和 $m$ 的关系式为 $n = \sqrt{m^2+168}$,所以 $n$ 的范围可以通过 $m$ 来确定。

  2. 判断 $n$ 是否为整数,如果是,求出 $x$,并判断 $x+268$ 是否为完全平方数。

  3. 如果找到符合条件的 $x$,输出并跳出循环。

你可能感兴趣的:(算法)