繁体   English   中英

Python - 获得立方体数字的位数之和

[英]Python - obtaining the sum of digits of cube numbers

我想在 python 中编写一个代码来打印从用户收到的范围内所有整个立方体数字的数字总和。 例如,如果他选择 [1,100],则显示与 (1,8,27,64) 相关的 1,8,9,10。

一般来说,最好的做法是展示你为解决问题所做的努力……而且,如果你允许我发表个人意见,如果你至少尝试一些东西,你会学得更快。

编辑:感谢@Python学习者,我误解了这个问题。 这应该去:

def main():
    low, up = 1, 100


    # list of all cubes in selected range
    cubes = []
    # go through numbers in selected range, check if they are cubes, append them to list if they are
    for i in range(low, up):
         if is_cube(i):
             cubes.append(i)

    # alternative way, using list comprehension
    #cubes = [n for n in range(low, up) if is_cube(n)]

    # once cubes have been found, go through list
    for cube in cubes:
        # convert each cube to a str, so you can iterate over the single digits, convert them back to int, and append them to a list
        cube_str = str(cube)
        digits_list = []
        for digit in cube_str:
            digits_list.append(int(digit))
        print(f'{cube} -> {sum(digits_list)}')


def is_cube(n):
    n = abs(n)  # if n is negative
    return round(n ** (1 / 3)) ** 3 == n


if __name__ == '__main__':
    main()

使用一个简单的 for 循环在一个数字范围内找到一个完美的立方体,然后计算它们的数字之和:

import math


def sum_digits(digit: int) -> int:
    sum_of_digits = 0
    while digit:
        sum_of_digits += digit % 10
        digit //= 10
    return sum_of_digits


def cube(x: int) -> float:
    if 0 <= x:
        return round(x ** (1.0 / 3.0), 10)
    return round(-((-x) ** (1.0 / 3.0)), 10)


def digits_in_cubes(start: int, stop: int) -> list[int]:
    result_list = list()
    for i in range(start, stop + 1):
        cube_root = cube(i)
        if cube_root == math.ceil(cube_root):
            result_list.append(sum_digits(i))
    return result_list


result = digits_in_cubes(1, 100)
print(result)

与其逐个检查范围中的每个数字是否为立方体,这非常浪费时间,您可以修改边界以了解所有数字,例如将它们提高到 3 的幂将在范围。

这种方法的优点是你不必计算每个数字的立方根,改变边界后,你直接知道哪些数字是有效的。


解释

  • 如果我们计算范围开始和结束的三次根,新范围将包含所有在startend之间有一个立方体的数字。
  • 如果startend不是完美的立方体,如果我们在开头,我们取上面的整数,如果我们在结尾,我们取下面的整数。

示例:范围是[1,100] ,通过计算立方根,我们得到[1, 4] 因此1234立方在范围内。

注意:这仅是可能的,因为f(x) = x^3严格增加。


import math

start = 1
stop = 100

cubes = []
for i in range(math.ceil(start**(1/3)), math.floor(stop**(1/3)) + 1):
    cubes.append(i**3)
print(cubes)  # [1, 8, 27, 64]
  • math.ceil()用于向上舍入到最接近的整数
  • math.floor()用于向下舍入到最接近的整数。
  • **(1/3)用于计算数字的三次方根(提高到 1/3 次方)。

一旦我们计算了所有的立方体,我们必须对它们求和。 有很多方法可以做到这一点,要么将数字转换为字符串,然后查看每个字符,要么将数字连续除以 10。

例如,我们可以使用递归函数,将除法的每个余数递归地相加,直到商为零。

import math

def sum_digits(num):
    q, r = divmod(num, 10)
    if not q:
        return r
    return sum_digits(q) + r

start = 1
stop = 100

cubes = []
for i in range(math.ceil(start**(1/3)), math.floor(stop**(1/3)) + 1):
    cubes.append(sum_digits(i**3))
print(cubes)  # [1, 8, 9, 10]

笔记:

如果边界可以是负数:

  • 立方根必须以不同的方式计算(使用numpy或乘以-1如果它是负数的立方)。
  • 必须使用立方体的绝对值来计算数字的总和。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM