用来练手的python 练习题,原链接 : python练习实例3
拿到题目就写了如下代码,思路是因为使用**0.5进行开平方操作时,python会将数据类型自动转换为float单精度浮点型。这里利用提取其整数部分,来判断这个数是否是完全平方数。
z = 13
while (z**2 - 168)**0.5 != int((z**2 - 168)**0.5):z+=1x = z**2-268
print(x)
输出结果 :
这个代码问题也很明显,没有办法穷举而只能找出最小的x的值。为了穷举所有的结果,参考答案给出了以下分析 :
假设该数为 x。
1、则:x+100=n2,x+100+168=m2x + 100 = n^2, x + 100 + 168 = m^2x+100=n2,x+100+168=m2, 其中m,n,x均为整数
2、计算等式:m2−n2=(m+n)(m−n)=168m^2 - n^2 = (m + n)(m - n) = 168m2−n2=(m+n)(m−n)=168
3、设置: m+n=i,m−n=j,i∗j=168m + n = i,m - n = j,i * j =168m+n=i,m−n=j,i∗j=168,i 和 j 至少一个是偶数
4、可得: m=(i+j)/2,n=(i−j)/2m = (i + j) / 2, n = (i - j) / 2m=(i+j)/2,n=(i−j)/2,由于m,n都是整数,因此 i 和 j 要么都是偶数,要么都是奇数。
5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。
6、由于 i∗j=168,j>=2i * j = 168, j >=2i∗j=168,j>=2,则 1<i<168/2+11 < i < 168 / 2 + 11<i<168/2+1 。
7、接下来将 i 的所有数字循环计算即可。
标准答案源代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-for i in range(1,85):if 168 % i == 0:j = 168 / i;if i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 :m = (i + j) / 2n = (i - j) / 2x = n * n - 100print(x)
通过分析题干我们最终确定了遍历的范围,实现了穷举,输出如下: