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

解这道题都需要先好好分析一下它的数学逻辑,根据题目可以得出
n + 100 = x 2 -----------------①
n + 100 +168 = y 2 ----------②
(x 2 +168= y 2 ,x,y都有正负解,选取正值,即x>=0,y>=0,因为我们求的是n的取值范围)
可以化简为
y 2 -x 2 =168 ----------( x <y)
(y-x)(y+x) =168
y-x > 0且应该为整数,因此可以推出 y+x<=168, y<=168---------③
将③带入②(因为带入①对应的n值更小)可以得出 n<= 168 2 -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

一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数请问该数是多少?假设该数为 x。1、则:x + 100 = n2, x + 100 + 168 = m22、计算等式:m2 - n2 = (m + n)(m - n) = 1683、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶,要么都是奇。 采用for in 遍历为i 设置取值范围1-10000 使用if and 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实 际进行比较的值之一。 打印输出i 题目7:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数请问该数是多少? 解析:一个整数(m)加上100后是一个完全平方数 => m+100>=0,所以m>=-100,m取值下限为-100; 两个完全平方数的差是168,由于y=x^2这样的二次函的图象是开口向上的抛物线,函在x>0区间内单调递增,其导可知两个相邻值y2-y1差值会越来越大 => (x+1)2-x2<=168,得x<=83.5。由于m=x^2-100,所以大约是m&lt 完全平方数:如果一个整数m是某一个整数x的平方,那么这个正整数m叫做完全平方数 设这个整数为x,根据题目:x+100=n^2,x+100+168=m^2 m^2-n^2=168,即(m+n)(m-n)=168 令m+n=i,m-n=j,i*j=168 则m=(i+j)/2,n=(i-j)/2,则i、j要么全是偶,要么全是奇 可得:i>j,j>=2,2<i<=84 import math for i in range(-100,2000): if (int(math.sqrt(i+100)))**2 == i+100 and int(math.sqrt(i+...