昨天我有一些空闲时间,以某种方式考虑过计算交叉和。 我的目标是计算所有给定数n之和。不要问为什么-它只是为了娱乐和学习东西。 所以对于n = 11,我希望我的结果看起来像这样:[1、2、3、4、5、6、7、8、9、1、2]
这是我的代码:
def dynamicCheckSumList(upperLimit):
dynamicChecksumList = []
for i in range(0, 10):
dynamicChecksumList.append(i)
for i in range(10, upperLimit+1):
length = getIntegerPlaces(i)
size = 10**(length-1)
firstNumber = i // size
ancestor = i-(firstNumber*size)
newChecksum = firstNumber + dynamicChecksumList[ancestor]
dynamicChecksumList.append(newChecksum)
return dynamicChecksumList
首先,我创建一个空列表,然后用数字和它们各自的总和填充数字0-9。 然后,我查看所有9以上的数字,直到上限。得到他们的长度。然后,我继续找出该数字的第一位。之后,我计算出没有该前导数字的数字。例如:如果我的i为5432,我将得到432。由于我已经保存了432的和,所以我可以将这个和与我的前导数字相加,就可以了。
def getIntegerPlaces(theNumber):
if theNumber <= 999999999999997:
return int(math.log10(theNumber)) + 1
else:
counter = 15
while theNumber >= 10**counter:
counter += 1
return counter
第二个功能是我在这里遇到的一个问题,该问题询问如何计算给定数字中的位数。
这里是否有任何方法(我想会有)来加快速度? 也将不胜感激将是有关如何节省内存的提示。为了好玩,我尝试将n设置为10亿。而且我的内存(16GB)爆炸了;)
答案 0 :(得分:0)
def digitSums2(n):
n = (n + 9) // 10 * 10 # round up to a multiple of 10
result = bytearray(range(10))
for decade in range(1, n//10):
r_decade = result[decade]
for digit in range(10):
result.append(r_decade + digit)
return result
有两个主要区别:
bytearray
每个计算值使用一个字节,从而节省了大量内存。它只允许最多255个数字,但是对于少于26位数字的数字就足够了。这在python中应该尽可能快。打印结果时要小心,因为它可能比计算本身要花更多的时间(尤其是在内存中进行复制)。