2016-07-25 1 views
1

회문수는 같은 방식으로 읽습니다. 2 자리 수 숫자의 곱으로 만든 최대 회문은 9009 = 91 × 99입니다.루비 (Ruby) - 매개 변수에서 하나씩 순차적으로 정수를 줄이고 이들과 반복합니다.

세 자리 숫자 숫자로 이루어진 최대 회 전기를 찾으십시오. 저는 루비와 코딩에 매우 익숙합니다. 그래서 꽤 오랫동안 고심하고 있습니다. 여기에 내가 무엇을 가지고 :

def biggest(num, num2) 
    total = num * num2 
    x = total.to_s.split('') 

    until x[0] == x[-1] && x[1] == x[-2] && x[2] == x[-3] 
    num = num - 1 
    num2 = num2 - 1 
    total = num * num2 
    x = total.to_s.split('') 
    end 

    return x 
end 

p biggest(999, 999) 

문제는이 동시에 두 PARAMS을 감소시키고 잘못된 답을 준다이다. 한 번에 하나의 숫자 만 줄여야한다고 생각합니다 : 999 - 1 * 999, 조건을 충족시키지 못하면 다른 숫자를 낮추십시오 : 999 - 1 * 999 - 1. 그리고이 사실을 반복 할 때까지 계속 반복하십시오.

나는이 방법에 대한 최선의 방법이 아니라는 것을 알고 있습니다. 수학적인 측면에서도 잘못이라고 생각하지만 방금 배우기 때문에이 코드를 개선 할 수있는 방법에 대해 통찰력을 주시기 바랍니다. 선택적인 접근 방식은 대단히 환영 할 만하다. 여기서 가장 중요한 것은 내 실수를 고치는 방법이다. 당신이 자신을 발견 당신이 모두 numnum2 따라서 [i, i]쌍보다는 [i, j] 반복 감소하기 때문에

+1

당신이 이중 (중첩) 루프가 필요합니다 (두 번째 인덱스가 x보다는 100부터 시작합니다 그냥 최적화)입니다. 숫자를 순환시키는 논리와 숫자가 회문인지 여부를 확인하는 논리를 분리해야합니다. 반복을 위해서'while'이나'until' 대신에 범위 나'Integer # downto' 메쏘드를 사용하십시오. –

+0

덕분에, 나는 그것을 시도 할 것이다 –

답변

2

는 구현이 작동하지 않는 주요 이유입니다.

두 번째 문제는 다른 후 그들에게 하나를 감소 않은 경우에도 until 여전히 솔루션 ∀ni, mj: ni ∈ 100..999, mj ∈ 100..999 and ni * mj is palindrome에 대한 [n0, m0]max(n0, m0) >= max(ni, mj), 있어야한다는 가정이다.

당신의 세 번째 문제는 문체입니다 - 루비는 더 높은 수준의 언어입니다. 그러나 당신은 수동으로 문자 비교를합니다. 여기에 가능한 솔루션입니다 :

max = 0 

100.upto(999) do |x| 
    x.upto(999) do |y| 
    product = x * y 
    max = product if product > max and product.to_s.reverse.to_i == product 
    end 
end 

max 

+0

오, 그게 미친 짓이야. 아주 깨끗한 해결책. 나는 놀랍다. 감사! –

관련 문제