与其逐个检查范围中的每个数字是否为立方体,这非常浪费时间,您可以修改边界以了解所有数字,例如提高它们的 3 次方将创建范围内的数字。
这种方法的好处是不用计算每个数字的立方根,改变边界后,直接知道哪些数字是有效的。
说明
- 如果我们计算范围开始和结束的立方根,新范围将包含所有在
start 和end 之间的立方数。
- 如果
start 和end 不是完美的立方体,我们在开头取上面的整数,如果在结尾取下面的整数。
示例:范围是[1,100],通过计算立方根,我们得到[1, 4]。因此1、2、3 和4 立方在范围内。
注意:这只是可能的,因为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 立方,如果它是负数)。
- 必须使用立方体的绝对值来计算数字的总和。