2

我正在研究这个看似简单的问题,我需要在数字的每个数字上加一个。示例:数字 = 1234;输出 = 2345

这很简单,但是当 9 是其中一个数字时,根据加法定律,9 将被 0 替换,并且 1 将添加到左边的数字(9 + 1 = 10,因此,位置值 = 0 & 结转 = 1) 示例:数字 = 1239 ; 输出 = 2350

number = 1234
s = str(number)
l = []

for num in s:
    num = int(num)
    num += 1
    if num > 9:
        num = 0
        l.append(num)
    else:
        l.append(num)

print int(''.join(str(v) for v in l))

有人可以向我解释一下,我应该使用什么逻辑?我可以在模数运算中看到一些东西,但不确定如何实现它。谢谢 :)

4

3 回答 3

7

一个简单的方法如下

考虑一个数字 N = a n a n-1 a n-2 ...a 0

那么 F(N) = N + (10 n-1 +10 n-2 .. 10 0 ) = N + int('1' XN) = N + (10 n - 1) / (10 - 1) = N + (10 n - 1) / 9

>>> def foo(N):
    return N + int('1'*len(str(N)))

>>> foo(1234)
2345
>>> foo(1239)
2350

编辑:通过利用幂公式的总和来简化一点

>>> def foo(N):
    return N + ((10**len(str(N)) - 1) // 9)
于 2014-10-25T17:49:47.047 回答
2

您的代码可以很容易地修改为以相反的顺序处理数字并保持进位状态。您正在寻找的“模算术”通常使用%运算符实现:

number = 1234
s = str(1234)
l = []

carry = 0
for num in reversed(s):
    num = int(num) + carry
    num += 1
    carry = num / 10
    l.append(num % 10)

print int(''.join(str(v) for v in reversed(l)))
于 2014-10-25T17:53:18.340 回答
2

纯数学:

num = num + (10**int(math.ceil(math.log10(num)))-1)//9
于 2014-10-25T17:52:07.500 回答