描述
费马大定理断言,当整数 n > 2时,关于 a,b,c 的方程 an = bn + cn 没有正整数解。
该定理被提出来后,历经三百多年,经历多人猜想辩证,最终在 1995 年被英国数学家安德鲁.怀尔斯证明。
当然,可以找到大于 1 的 4 个整数满足完美立方等式:a3 = b3 + c3 + d3 (例如 123 = 63 + 83 + 103)
编写一个程序,对于任意给定的正整数 N(N<=100),寻找所有的四元组(a,b,c,d),满足 a3 = b3 + c3 + d**3
其中 1 < a,b,c,d <=N
输入格式
正整数 N(N <= 100)
输出格式
按照 a 的值从小到大,每行输出一个完美立方等式,其中b,c,d按照非降序排列输出。
(若两个完美立方式中 a 值相同,则 b 值小的先输出;在 b 值相等的情况下,c 值小的先输出,在 b,c 都相等的情况下,d 值小的先输出。)
#枚举法
N = int(input())
ls = []
for i in range(1,N + 1): # 计算一次i的三次方存于列表,可减少计算量
ls.append(i * i * i)
for a in range(2,N + 1): # a从2-N
for b in range(2,a): # b,c,d都不会大于a,这样可减少计算量
for c in range(b,a): # c大于等于b
for d in range(c,a): # d大于等于c,此设置保证非降序
if ls[a-1] == ls[b-1] + ls[c-1] + ls[d-1]:
print("Cube = {},Triple = ({},{},{})".format(a,b,c,d))
N = int(input())
ls = []
for i in range(1,N + 1): # 计算一次i的三次方存于列表,可减少计算量
ls.append(i * i * i)
for a in range(6,N + 1): #小于6无满足条件的数,可减少计算量
for b in range(2,a): # b,c,d都不会大于a,这样可减少计算量
for c in range(b,a): # c大于等于b
for d in range(c,a): # d大于等于c,此设置保证非降序
if a * a * a == b * b * b + c * c * c + d * d * d :
print("Cube = {},Triple = ({},{},{})".format(a,b,c,d))
itertools 模块 的combinations(iterable, r) 方法可以创建一个迭代器,返回 iterable 中所有长度为 r 的子序列,返回的子序列中的项按输入 iterable 中的顺序排序。
n = int(input())
ls = itertools.combinations(range(2,n + 1),3)
print(list(ls))
输入8
可以输出小于8的所有长度这3的子序列
[(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, 4, 8), (2, 5, 6), (2, 5, 7), (2, 5, 8), (2, 6, 7), (2, 6, 8), (2, 7, 8), (3, 4, 5),
(3, 4, 6), (3, 4, 7), (3, 4, 8), (3, 5, 6), (3, 5, 7), (3, 5, 8), (3, 6, 7), (3, 6, 8),
(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, 6, 8), (5, 7, 8), (6, 7, 8)]
import itertools
n = int(input())
ls = itertools.combinations(range(2,n + 1),3) # 得到长度为 3 的子序列
result = []
for item in ls: # 遍历列表
num = sum([x ** 3 for x in item]) ** (1 / 3) # 序列元素的 3 次幂再再3次方
if round(num,4) == int(round(num,4)) <= n: # 如果是不大于 n 的整数
result.append([int(round(num,4)),item]) # 将该数和对应的元组加到列表中
result.sort(key = (lambda x: x[0])) # 列表元素排序
for x in result: # 遍列表,按格式输出
print("Cube = {},Triple = ({},{},{})".format(x[0], *x[1]))
函数实现
import itertools
def subsequences(n):
return itertools.combinations(range(2,n + 1),3)
def answer(ls):
result = []
for item in ls: # 遍历列表
num = sum([x ** 3 for x in item]) ** (1 / 3) # 序列元素的 3 次幂再再3次方
if round(num, 4) == int(round(num, 4)) <= n: # 如果是不大于 n 的整数
result.append([int(round(num, 4)), item]) # 将该数和对应的元组加到列表中
result.sort(key=(lambda x: x[0])) # 列表元素排序
return result
def output(ls):
for x in ls: # 遍列表,按格式输出
print("Cube = {},Triple = ({},{},{})".format(x[0], *x[1]))
if __name__ == '__main__':
n = int(input()) # 输入整数
sub = subsequences(n) # 调用subsequences(n)获得子序列生成器
output(answer(sub)) # 调用output()输出,参数是调用answer(sub)得到的列表
列表推导式
n=int(input())
ls=[(a,b,c,d) for a in range(2,n+1) for b in range(2,n+1)
for c in range(b,n+1) for d in range(c,n+1)
if a**3==b**3+c**3+d**3 and b<c<d]
ls.sort(key=lambda x:(x[0],x[1],x[2],x[3]))
for i in range(len(ls)):
print('Cube = {},Triple = ({},{},{})'.format(ls[i][0],ls[i][1],ls[i][2],ls[i][3]))