【问题标题】:Increase digits of a number by one将数字的位数加一
【发布时间】:2014-10-25 17:45:39
【问题描述】:

我正在解决这个看似简单的问题,我需要在数字的每个数字上加一。示例:数字 = 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))

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

【问题讨论】:

  • 为什么不s = str(number)?如果您需要更改号码,它将节省输入。

标签: python modular-arithmetic


【解决方案1】:

一个简单的方法如下

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

那么 F(N) = N + (10n-1+10n-2 .. 100) = N +整数('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)

【讨论】:

  • 哇,这很优雅。你能解释一下吗?对我来说,现在是清晨,没有咖啡,我无法将我的大脑包裹起来:)。另外,我相信你可以在不导入math 的情况下做到这一点
  • @Parker:已添加说明。是的,你可以不用数学。最初我想添加 log 魔术来查找字符串的长度,然后我意识到它有点矫枉过正,而且还有精度问题。
  • @Abhijit 哇!极好的!!甚至没有想到这一点。惊人的!!美丽总比丑陋好。显式优于隐式。简单胜于复杂。 - Python之禅:D
  • 不错!您可能希望确保 10**len(str(N)) / 9 始终返回一个整数(Python 3...)
【解决方案2】:

纯数学:

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

【讨论】:

  • 您肯定会在精度问题上提出建议,在此处使用注销时可能会给出错误结果
  • @Abhijit:当然,如果您的号码超过 10**15 位。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 2022-11-12
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多