증가

2017-03-06 2 views
1

I 함수 정의 가지고 증가

은 양의 정수 original부터을 n 의해 original 승산 유지를 포함하여 생성 된 모든 배수의 합을 계산 합계가 total보다 작아 질 때까지 original 주어진 총계에 이상의 값에 도달하는 데 필요한 최소 승수를 반환하십시오.

    = 2
  1. multiply_until_total_reached (1,5,2)

    1 * 2 (1 + 2) < 5, 2 × 2 = 4, (1 + 2 + 4)> 그래서 예를 들면

5, 2 개는 승산

= 2
  • multiply_until_total_reached (1,15,2)

    1 * 2, 필요한 (1 + 2) < 15, 2 × 2 = 4, (1 + 2 + 4) < 15 * 2 = 8 (4), (1 + 2 + 4 + 8) = 15, 3 승산

  • 내 현재 코드 작동하지만 리턴 값은 경우에 따라 1 씩 떨어져있다. 1,1038,2의 경우 10 대신 9 곱셈이 필요하지만 1,15,2의 경우 올바른 곱셈 (3) 곱셈을 얻습니다.

    여기 내 코드입니다 :

    def multiply_until_total_reached(original, total, n): 
        if total < original: 
         return 0 
        elif total > original: 
         sumofdigits = 0 #declares var to keep track of sum of digits to compare to total 
         timesofmult = 0 #track how many multiplication operations 
         while sumofdigits <= total + 1: 
          multnum = original * n 
          sumofdigits = multnum + original 
          original = multnum 
          sumofdigits = sumofdigits + multnum 
          timesofmult = timesofmult + 1 
         return timesofmult 
    

    은 꺼져 무엇의 원인?

    +0

    을 == 원래의 경우. 'if total = original : return 0'을 사용해야합니다. – Bakuriu

    +0

    당신이 원한다면 이것에 대한 O (1) 또는 O (logn) 해결책이있을 것 같네요. –

    +0

    @AbhishekJebaraj this는'O (log n)'솔루션입니다. 여기서 'n'은 값을 나타냅니다 전체의. – EvilTak

    답변

    2

    시도해보십시오. 훨씬 작고 깨끗합니다. 설명은 설명에 있습니다.

    def multiply_until_total_reached(original, total, n): 
         sum = original #Initialize sum to original 
         mult_no = 0 
    
         while sum < total:  #Will auto return 0 if original>=total 
          sum += original*n #Add original * n 
          original = original*n #Update the new original 
          mult_no += 1 #Increase multiplications by 1 
    
         return mult_no 
    
    print multiply_until_total_reached(1,5,2) 
    print multiply_until_total_reached(1,15,2) 
    print multiply_until_total_reached(1,1038,2) 
    
    #Output 
    #2 
    #3 
    #10 
    
    +0

    이것은보다 간결한 방식으로 문제를 해결하지만 실제로 질문에 답하지 않고 OP가 이해하는 데 도움이되지 않습니다. –

    +1

    그래, 그가 학생이었고 배우고 싶었고 그의 실수를 찾아 내고 싶다면 많은 도움이되지는 않을 것이다. 그러나 그가 일하고 있으면 좀 더 깔끔한 코드와 빠른 대답을 원한다면 많은 도움이 될 것이다. –

    +1

    그래, 내가 어쨌든 upvoted 좋은 해결책입니다. :-) –

    2

    모든 루프 반복에서 sumofdigits을 재 할당하고 있습니다. 반복 할 때마다 multnumsumofdigits에 추가하면됩니다 (sumofdigits += multnum). 또한 루프 조건은 에 도달하는 데 필요한 최소 곱셈 횟수를또는 이상으로 반환해야하므로 루프 상태는 sumofdigits < total으로 고정되어야합니다. "

    +0

    오케이. 그래서 첫 번째 sumofdigits = multnum + original을 지우고 sumofdigits + = multnum을 사용해야 만합니까? TIA –

    +1

    @ Pritster5 예. – EvilTak

    1

    하면 코드에 대한 솔루션은 이미 게시 된, 당신은 나 파이썬> 3.2 accumulate() 기능을 잘 활용하게 다음, 제안 할 수 있도록, 다른 솔루션을 받아 이후 : 당신은 '총을 누락

    from itertools import accumulate, count 
    
    def multiply_until_total_reached(original, total, n): 
        for i, result in enumerate(accumulate(original*n**c for c in count())): 
         if result >= total: return i 
    
    assert multiply_until_total_reached(1,5,2) == 2 
    assert multiply_until_total_reached(1,15,2) == 3 
    assert multiply_until_total_reached(1,1038,2) == 10 
    
    +0

    솔루션을 고맙게 생각하지만 불행히도 코드에서 이러한 기능을 사용할 수 없습니다. –