描述

费马大定理断言,当整数 n > 2时,关于 a,b,c 的方程 an = bn + cn 没有正整数解。
该定理被提出来后,历经三百多年,经历多人猜想辩证,最终在 1995 年被英国数学家安德鲁.怀尔斯证明。
当然,可以找到大于 1 的 4 个整数满足完美立方等式:a
3 = b3 + c3 + d3 (例如 123 = 63 + 83 + 103)
编写一个程序,对于任意给定的正整数 N(N<=100),寻找所有的四元组(a,b,c,d),满足 a
3 = b3 + c3 + d**3
其中 1 < a,b,c,d <=N‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输入格式

正整数 N(N <= 100)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出格式

按照 a 的值从小到大,每行输出一个完美立方等式,其中b,c,d按照非降序排列输出。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
(若两个完美立方式中 a 值相同,则 b 值小的先输出;在 b 值相等的情况下,c 值小的先输出,在 b,c 都相等的情况下,d 值小的先输出。)

  1. #枚举法
  2. N = int(input())
  3. ls = []
  4. for i in range(1,N + 1): # 计算一次i的三次方存于列表,可减少计算量
  5. ls.append(i * i * i)
  6. for a in range(2,N + 1): # a从2-N
  7. for b in range(2,a): # b,c,d都不会大于a,这样可减少计算量
  8. for c in range(b,a): # c大于等于b
  9. for d in range(c,a): # d大于等于c,此设置保证非降序
  10. if ls[a-1] == ls[b-1] + ls[c-1] + ls[d-1]:
  11. print("Cube = {},Triple = ({},{},{})".format(a,b,c,d))


  1. N = int(input())
  2. ls = []
  3. for i in range(1,N + 1): # 计算一次i的三次方存于列表,可减少计算量
  4. ls.append(i * i * i)
  5. for a in range(6,N + 1): #小于6无满足条件的数,可减少计算量
  6. for b in range(2,a): # b,c,d都不会大于a,这样可减少计算量
  7. for c in range(b,a): # c大于等于b
  8. for d in range(c,a): # d大于等于c,此设置保证非降序
  9. if a * a * a == b * b * b + c * c * c + d * d * d :
  10. print("Cube = {},Triple = ({},{},{})".format(a,b,c,d))


itertools 模块 的combinations(iterable, r) 方法可以创建一个迭代器,返回 iterable 中所有长度为 r 的子序列,返回的子序列中的项按输入 iterable 中的顺序排序。

  1. n = int(input())
  2. ls = itertools.combinations(range(2,n + 1),3)
  3. print(list(ls))

输入8
可以输出小于8的所有长度这3的子序列

  1. [(2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 3, 7), (2, 3, 8), (2, 4, 5), (2, 4, 6), (2, 4, 7),
  2. (2, 4, 8), (2, 5, 6), (2, 5, 7), (2, 5, 8), (2, 6, 7), (2, 6, 8), (2, 7, 8), (3, 4, 5),
  3. (3, 4, 6), (3, 4, 7), (3, 4, 8), (3, 5, 6), (3, 5, 7), (3, 5, 8), (3, 6, 7), (3, 6, 8),
  4. (3, 7, 8), (4, 5, 6), (4, 5, 7), (4, 5, 8), (4, 6, 7), (4, 6, 8), (4, 7, 8), (5, 6, 7),
  5. (5, 6, 8), (5, 7, 8), (6, 7, 8)]


  1. import itertools
  2. n = int(input())
  3. ls = itertools.combinations(range(2,n + 1),3) # 得到长度为 3 的子序列
  4. result = []
  5. for item in ls: # 遍历列表
  6. num = sum([x ** 3 for x in item]) ** (1 / 3) # 序列元素的 3 次幂再再3次方
  7. if round(num,4) == int(round(num,4)) <= n: # 如果是不大于 n 的整数
  8. result.append([int(round(num,4)),item]) # 将该数和对应的元组加到列表中
  9. result.sort(key = (lambda x: x[0])) # 列表元素排序
  10. for x in result: # 遍列表,按格式输出
  11. print("Cube = {},Triple = ({},{},{})".format(x[0], *x[1]))

函数实现

  1. import itertools
  2. def subsequences(n):
  3. return itertools.combinations(range(2,n + 1),3)
  4. def answer(ls):
  5. result = []
  6. for item in ls: # 遍历列表
  7. num = sum([x ** 3 for x in item]) ** (1 / 3) # 序列元素的 3 次幂再再3次方
  8. if round(num, 4) == int(round(num, 4)) <= n: # 如果是不大于 n 的整数
  9. result.append([int(round(num, 4)), item]) # 将该数和对应的元组加到列表中
  10. result.sort(key=(lambda x: x[0])) # 列表元素排序
  11. return result
  12. def output(ls):
  13. for x in ls: # 遍列表,按格式输出
  14. print("Cube = {},Triple = ({},{},{})".format(x[0], *x[1]))
  15. if __name__ == '__main__':
  16. n = int(input()) # 输入整数
  17. sub = subsequences(n) # 调用subsequences(n)获得子序列生成器
  18. output(answer(sub)) # 调用output()输出,参数是调用answer(sub)得到的列表

列表推导式

  1. n=int(input())
  2. ls=[(a,b,c,d) for a in range(2,n+1) for b in range(2,n+1)
  3. for c in range(b,n+1) for d in range(c,n+1)
  4. if a**3==b**3+c**3+d**3 and b<c<d]
  5. ls.sort(key=lambda x:(x[0],x[1],x[2],x[3]))
  6. for i in range(len(ls)):
  7. print('Cube = {},Triple = ({},{},{})'.format(ls[i][0],ls[i][1],ls[i][2],ls[i][3]))