2014-10-25 6 views
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)) 

누군가가 내게 어떤 논리를 사용해야합니까? 모듈러 산술의 라인에서 뭔가를 볼 수는 있지만 구현 방법은 확실하지 않습니다.

숫자 N = A N 있다면 다음 감사 :)

+0

왜 's = str (number)'가되지 않습니까? 번호를 변경해야하는 경우 입력을 절약 할 수 있습니다. – SethMMorton

답변

6

간단한 접근 할 것 N-1 N-2 ... 0

나서 F (N) = N + (10 N-1 +10 N-2 .. 10 0) = N + INT ('1'XN) = N + (1 0 N-1)/(1 - 10) = 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) 
순수 수학으로
+1

와우 우아합니다. 이걸 설명 할 수 있니? 나에게는 이른 아침이고 커피가 없으면이 주변에 내 뇌를 감쌀 수 없다. :). 또한, 수학을 가져 오지 않고도이 작업을 수행 할 수 있습니다. – 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

당신은 확실히 로그 아웃을 사용할 때 잘못된 결과를 줄 수있는 정밀도 문제를 조언 할 것입니다 (10.3 len (str (N))/9 항상 정수를 반환합니다. 여기 – Abhijit

+0

@Abhijit : 10 ** 15 자리가 넘는 번호가있는 경우 – Daniel

+0

또한 num이 1 또는 0 일 때 작동하지 않습니다. – Abhijit

1
코드는 쉽게 반전 ORD에서 숫자를 처리하기 위해 수정 될 수

캐리 상태를 유지합니다. 찾고있는 "모듈러 산술"은 보통 % 연산자를 사용하여 구현됩니다.

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))) 
관련 문제