2014-10-25 4 views
2

Я работаю над этой, казалось бы, простой проблемой, когда мне нужно добавить одну к каждой цифре числа. Пример: число = 1234; output = 2345Увеличьте цифры числа на один

Это просто, но когда 9 является одной из этих цифр, то по закону сложения, что 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)) 

Может кто-нибудь объяснить мне, какую логику я должен использовать? Я могу что-то увидеть в строках модульной арифметики, но не совсем уверен, как это реализовать. спасибо :)

+0

Почему бы не сделать 'S = Str (число)'? Это позволит сохранить ввод текста, если вам нужно изменить номер. – SethMMorton

ответ

6

Простой подход будет выглядеть следующим образом

Рассмотрим N число = а п п-1 п-2 ... A

Тогда F (N) = N + (10 п-1 +10 п-2 .. 10) = N + INT ('1' XN) = N + (1 0 п - 1)/(10 - 1) = N + (10 п - 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

+0

@Abhijit ничего себе! фантастика!! Даже не думал об этом. Потрясающие!! Красивая лучше, чем уродливая. Явный лучше, чем неявный. Простой лучше, чем сложный. - Zen of Python: D – hky404

2

с чистой математикой:

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

Вы бы определенно посоветовали бы в вопросах точности, которые могли бы дать неправильный результат при использовании выхода из системы здесь – Abhijit

+0

@Abhijit: конечно, если у вас есть номер с более чем 10 ** 15 цифр. – Daniel

+0

Кроме того, не работает, если num равно 1 или 0 – Abhijit

1

Вашего код может быть легко модифицирован для обработки цифр в обратном Орде er и поддерживать состояние переноса. «Модульная арифметика» вы ищете, как правило, реализуется с помощью % оператора:

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

 Смежные вопросы

  • Нет связанных вопросов^_^