题目要求:
Srinivasa Ramanujan是一个因他在数字上的天分而出名的印度数学家。有一天,英国数学家G.H.Hardy来拜访他,Hardy提到自己乘坐的出租车标有一个相当无聊的数字1729。Ramanujan 当即回答道,“不,Hardy!不,Hardy!这是一个非常有趣的数字!”。Ramanujan说:“对1729这个数字,存在2组不同的数,且每组只有2个数值,每一组数值的立方和等于1729,且1729是能够被两组不同的数按上述条件表达的数中最小的那个!”。
请在指定位置完成函数编写,验证这句话是否正确。程序将整数N作为输入,按一定格式返回所有能够被上述方法表示的小于或等于N的整数。换句话说,就是找到4个不同的正整数a、 b、 c、 d 且 a3+b3=c3+d3
。(提示:用4个嵌套循环)。
题目解读:
给定一个范围,求出范围内所有满足a3+b3=c3+d3的数
比如:输入10000,找到两个满足要求的数据
函数部分
代码可能有待修改
def ramanujan(n):
results = []
a=1
b=1
c=1
d=1
while True:#第一层循环,用来控制a,防止超出查找范围
if(a**3>n):
break
else:
b=a+1
while True:#第二次循环,用来控制a^3+b^3的范围
x=a**3+b**3
if x>n:
break
else:
c=a+1
while True:
if c**3>x:#缩小控制范围,减少时间复杂度
break
else:
d=c+1
while True:
if x==c**3+d**3:#控制输出格式
s=str(x)+' = '+str(a)+'^3 + '+str(b)+'^3 = '+str(c)+'^3 + '+str(d)+'^3'
results.append(s)
break
elif d>b:
break
else:d+=1 #使用后加一
c+=1#使用后加一
b+=1#使用后加一
a+=1#使用后加一
return results
主函数部分
主函数用来给定查找范围
if __name__ == '__main__':
for num in [2000, 10000, 100000]:
st = ramanujan(num)
for item in st:
print(item)