2

私はこの一見単純な問題に取り組んでおり、数字のすべての桁に 1 を追加する必要があります。例: 番号 = 1234 ; 出力 = 2345

それは簡単ですが、9 がそれらの数字の 1 つである場合、加算の法則により、その 9 は 0 に置き換えられ、左側の数字に 1 が追加されます (9 + 1 = 10、したがって、位の値 = 0 & キャリーオーバー = 1) 例: number = 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

純粋な数学の場合:

num = num + (10**int(math.ceil(math.log10(num)))-1)//9
于 2014-10-25T17:52:07.500 に答える
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 に答える