2014-07-11 4 views
2

숫자가 있고 숫자에 실수가 곱 해지는 지보고 싶습니다. 새 숫자 이전 숫자와 정확히 같은 자릿수를 가지고 재 배열 만합니다. 나는 숫자가 동일하게 유지하는 경우 2 숫자를 곱보고 싶어 예를 들어, 내가루비 - 숫자의 배수가 원래 숫자와 정확히 같은 자릿수인지 확인 (재 배열)

125874 
=> 251748 

251748가 125,874 2를 곱 두 숫자가 동일한 숫자를 할 것입니다 만 재 배열 . 단순성을 위해 지금은 2의 배수로 테스트하고 있습니다. 이것은 내가 시도하고 실패한 것입니다.

x = 125874 
array = x.to_s.chars.map{|x|x.to_i} 
    => [1,2,5,8,7,4] 
array.permutation.include?((x * 2).to_s.chars.map{|x|x.to_i} 
    => true 

이제 루프에서이를 실행하여이 기준을 충족하는 100,000 미만의 모든 숫자를 찾으려고했습니다. 125,874 * 2 내가이 일에 자신을 밖으로 혼동 관리 생각 125874.

의 순열 251748을, 동일하기 때문에

range = (1..100000).to_a 
range.select do |x| 
    array = x.to_s.chars.map{|x|x.to_i} 
    array.permutation.include?((x * 2).to_s.chars.map{|x|x.to_i} 
end 
    => [] 

지금, 그것은, 그 배열에 적어도 125,874 기록해야 .

+0

내 대답 (8 월 4 일 유일한 답)을 찾은 경우 도움을 받으십시오. –

답변

3

먼저 주어진 숫자가 반복되는 숫자가 포함되어있는 경우, 우리는 번호와 제품 번호와 승수 어느 번호에 표시되는 각 숫자 같은 수의 포함 할 것을 요구하고 있다고 가정합니다

def same_digits?(nbr, mult) 
    nbr.to_s.chars.sort == (nbr * mult).to_s.chars.sort 
end 

same_digits?(125874,2) #=> true (125874*2 => 251748) 
same_digits?(125874,3) #=> false (125874*3 => 377622) 

nbr을하는 경우를 및 nbr*prod 같은 숫자를 포함해야하지만, 반드시 그 자리의 각각의 동일한 수는 방법은 약간 다른이 두 번째 경우

def same_digits?(nbr, mult) 
    nbr.to_s.chars.uniq.sort == (nbr * mult).to_s.chars.uniq.sort 
end 

same_digits?(10255,2) #=> true (10255*2 => 20510) 
same_digits?(10255,3) #=> false (10255*3 => 30765) 

다른 많은 방법이있다 중복이 제거 된 후 두 개의 배열에 동일한 요소가 포함되어 있는지 확인합니다. Let :

a = nbr.to_s.chars.uniq 
b = (nbr*mult).to_s.chars.uniq 

위 일치 항목을 확인하기 위해 a.sort == b.sort을 사용했습니다. 다른 방법은 다음과 같습니다.

(a&b)==a && (a&b)==b   # Array intersection 

(a-b).empty? && (b-a).empty? # Array difference 

require 'set' 
a.to_set == b.to_set