完美立方数

# 方法一:枚举法
N = int(input())
ls = []
for i in range(1, N + 1):  # 计算一次i的三次方存于列表,可减少计算量
    """
    这里这一步很新奇,正常思维都会在嵌套循环的最后里面写上a**3=b**3+c**3+d**3,这样写会造成非常大的运算量。
    """
    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 = [(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]))  # sort可以实现多key值排序
for i in range(len(ls)):
    print('Cube = {},Triple = ({},{},{})'.format(ls[i][0], ls[i][1], ls[i][2], ls[i][3]))

# 简化列表推导式
n = int(input())
ls = [(a, b, c, d) for a in range(2, n + 1) for b in range(2, a)
      for c in range(b, a) for d in range(c, a)
      if a ** 3 == b ** 3 + c ** 3 + d ** 3]
for i in range(len(ls)):
    print('Cube = {},Triple = ({},{},{})'.format(ls[i][0], ls[i][1], ls[i][2], ls[i][3]))

# 方法二:枚举法+抹去不满足条件的数,a从6开始
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 模块:
"""
itertools 模块 的combinations(iterable, r) 方法可以创建一个迭代器,
返回 iterable 中所有长度为 r 的子序列,返回的子序列中的项按输入 iterable 中的顺序排序。
(iterable是一个数列,返回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)得到的列表

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十四桥_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值