题目:一个整数,它加上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()
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<
完全平方数:如果一个正整数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+...