将数字的各个位数加一

3
我正在处理一个看似简单的问题,需要将数字的每个位数加1。例如:number=1234; output=2345。
这很简单,但是当数字中有9时,根据加法法则,9将被替换为0,并在左侧的数字上加1(9 + 1 = 10,因此,位值为0,进位为1)。 例如:number=1239; output=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))

请问有人能解释一下,我应该使用什么逻辑?我可以看到与模算术有关的内容,但不确定如何实现。 谢谢 :)


为什么不使用s = str(number)?如果您需要更改数字,这将节省输入。 - SethMMorton
3个回答

7

一个简单的方法如下:

考虑一个数字N= anan-1an-2...a0

然后F(N) = N + (10n-1+10n-2 .. 100) = N + int('1' X N) = N + (10n - 1) / (10 - 1) = N + (10n - 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)

1
哇,这太优雅了。你能解释一下吗?我现在还没有喝咖啡,脑子转不过来 : ) 。此外,我相信你可以在不导入math的情况下完成这个。 - Parker
1
@Parker:已添加说明。是的,你可以不用数学方法解决。最初我想添加“log”魔法来查找字符串的长度,但后来意识到这是一种过度设计,而且存在精度问题。 - Abhijit
@Abhijit 哇!太棒了!!我甚至没有想到那个方向。太棒了! 美丽胜于丑陋。 显式优于隐式。 简单胜于复杂。
  • Python之禅 :D
- hky404
不错!你可能想要确保 10**len(str(N)) / 9 总是返回一个整数(Python 3...) - Alex Riley

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)))

2

使用纯数学:

num = num + (10**int(math.ceil(math.log10(num)))-1)//9

在这里退出时可能会出现精度问题,导致错误的结果,您肯定会建议注意。 - Abhijit
@Abhijit:当然,如果你有一个超过10**15位数的数字。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接