【问题标题】:Python - obtaining the sum of digits of cube numbersPython - 获得立方体数字的位数之和
【发布时间】:2022-07-12 21:58:53
【问题描述】:

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

【问题讨论】:

  • 这是一个不错的项目。我会去的。
  • 请展示您的尝试
  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: python


【解决方案1】:

一般来说,good practice 会显示您尝试解决问题的方法...如果您允许我发表个人意见,如果您至少尝试一些东西,您会学得更快。

编辑:感谢@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()

【讨论】:

  • 不错!但我认为 op 想从给定的 range(1,100) 中找到立方体编号而不是其他方式
  • 抱歉,我不确定我理解你的意思 :) 如果 OP 想要从 1 变为 100,他们只需要在我的代码中选择正确的低值即可。然后,计算所有立方体,并为每个立方体计算数字的总和。我弄错了吗? :S
  • 我的意思是我们需要找到给定范围内所有可用的立方体编号,然后完成剩下的工作。例如,它应该为 range(1,30) 返回 1,8,9。
  • 已编辑,感谢您的澄清!
【解决方案2】:
import numpy as np
from math import ceil
from typing import Generator


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


def cubes(start: int, stop: int) -> Generator[int, None, None]:
    for i in range(start, stop + 1):
        cbrti = np.cbrt(i)
        if cbrti == ceil(cbrti):
            yield sum_digits(i)


result = [*cubes(1, 100)]
print(result)

【讨论】:

    【解决方案3】:

    与其逐个检查范围中的每个数字是否为立方体,这非常浪费时间,您可以修改边界以了解所有数字,例如提高它们的 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 立方,如果它是负数)。
    • 必须使用立方体的绝对值来计算数字的总和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多