题目来源:菜鸟教程
百题地址:https://dwz.cn/Ol2QUMGD
题目序号:3
题目描述:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,
请问该数是多少?
【开动脑筋】
看到这个题目,我的第一个问题就是什么是完全平方数
开启百度:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。
抛开题目,先来练个手:找出100以内的完全平方数
for i in range(0,100):for j in range(0,i):if i==j*j:
print(i)
运行:
4
9
16
25
36
49
64
81
继续,根据题目去思考,该数加上100是完全平方数
修改程序
# 加上100for i in range(0,1000):for j in range(0,i):if i+100==j*j:
print(i)
运行
21
44
69
96
再继续,根据题目去思考,该数加上168是完全平方数,注意,这是第一个坑,不是加上168,而是再加上168,其实是加上原来那个数加上268,才是完全平方数
修改代码,实现
# 加上268for i in range(0,100):for j in range(0,i):if i+268==j*j:
print(i)
运行
21
56
93
那么两者都符合呢,继续思考,就是两者结果之交集嘛
修改代码,实现:
# 那么如何既满足加100,又满足加168呢
w=[]for i in range(0,100):for j in range(0,i):if i+100==j*j:
w.append(i)for i in w:for j in range(0,i):if i+268==j*j:
print(i)
运行结果:
21
Ok,完成!
但细想,这和以往的vb程序没什么差别,去找找库,能不能再简化一点
开方,开方,那不是math库里面的开方函数嘛,开方结果是浮点数,将该结果int一下,如果相同,那么开方的那个数就是完全平方数了
修改代码
import mathfor i in range(0,100):
m=math.sqrt(i+100)
n=math.sqrt(i+268)if m==int(m) and n==int(n):
print(i)
运行结果:
21
完美!
打开网站去看看答案,是不是相同,不是的,答案不对。
仔细看代码,原来坑不止一个,Python整数可没有范围,习惯性地进入到了0-100阶段
百度里还有一句话:完全平方数是非负数。
因为加上100是完全平方数,所以它的范围最小可以为-100,最大范围则还没有定
贴上网站答案分析,分析得还挺简单,我就不再展开了
分析:
假设该数为 x。
1、则:x + 100 = n2, x + 100 + 168 = m2
2、计算等式:m2 - n2 = (m + n)(m - n) = 168
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。
5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。
6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。
7、接下来将 i 的所有数字循环计算即可。
代码:
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) / 2
n = (i - j) / 2
x = n * n - 100
print(x)
看懂分析和程序代码,可能需要有数学计算公式的基础,在中职展开这个题目的教学,有点难度了。
【写在最后】
解答本题需要学生有for结构,if结构的知识基础,需要对完全平方数有所了解,对数学库的了解可以简化该题目的解答,当然里面一定要注意int函数的转换功能以及比较
本题的坑有两处,1是题目的文字游戏,不要看错了,2是范围问题,这个就需要一点点数学基础。
另外,开方功能其实可以用一个算法“二分法”来解决,我从网上找来了一段代码,不妨多加看看,有益于提升自我:
地址:https://blog.csdn.net/qiubingcsdn/article/details/82958107
该方法的作者:求兵
题目:给一个正整数num,写一个函数判断它是否是一个完全的平方数,是则返回True,不是返回False
代码:
def isPerfectSquare(self, num):
"""
:type num: int
:rtype: bool
"""
low = 1
high = num
while low < high:
mid = (low + high) // 2
if mid * mid == num:
return True
elif mid * mid < num:
low = mid + 1
else:
high = mid - 1
return low * low == num
【展示下一题】
题目序号:4
题目描述:输入某年某月某日,判断这一天是这一年的第几天?