题目来源:菜鸟教程

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

问题分析

解这道题都需要先好好分析一下它的数学逻辑,根据题目可以得出
n + 100 = x2 -----------------①
n + 100 +168 = y2----------②
(x2+168= y2,x,y都有正负解,选取正值,即x>=0,y>=0,因为我们求的是n的取值范围)
可以化简为
y2 -x2 =168 ----------( x <y)
(y-x)(y+x) =168
y-x > 0且应该为整数,因此可以推出 y+x<=168, y<=168---------③
将③带入②(因为带入①对应的n值更小)可以得出 n<= 1682-100-168=27956
因为这个数加上100是一个完全平方数(大于零)
所以所求数字必须大于等于-100
由上可以得出
1、n的下限为-100
2、n的上限为27956
知道n的范围,就可以使用math函数辅助来遍历对应的值
令 x = 100+n开根然后取整 同理y = 268+n 开根取整
然后把 x、y 带入①②中验证等式是否成立,若两个等式均成立,则输出对应的结果。

解法

import math
for n in range(-100,27956):
    x = int(math.sqrt(100+n))
    y = int(math.sqrt(100+168 + n))
    if 100+n ==x*x and 268+n == y*y :
        print(n)

输出结果为:
-99
21
261
1581

后记

我看了很多解法,他们的n的上限都取了10000,这估计是因为看到符合条件的n最大值才是1581吧,但是这是没根据的。还有一种解法是菜鸟教程上给出的解法,前期的数学分析的很多,大家可以看看这种解法:菜鸟的解法
虽然遍历很耗费时间,但我认为在不追求效率的情况下,这种方法是可取的。
至于怎么计算程序的耗时问题,我查了一下
可以这么操作:导入time 模块 调用相应的函数即可运行代码如下:

import math
import time
start = time.perf_counter()  #起始时间非常小 可以记做0
for n in range(-100,27956):
    x = int(math.sqrt(100+n))
    y = int(math.sqrt(100+168 + n))
    if 100+n ==x*x and 268+n == y*y :
        print(n)
end1 = time.perf_counter()  #结束的时间
time =end1 -start
print(time)

运行结果为:
-99
21
261
1581
0.03839473499999979

注:本文的题目来源于菜鸟教程的Python100例-3,本人使用的编译平台是PyCharm Community Edition 2020.2.1 x64

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐