주어진 숫자 n에 대해 주어진 두 숫자 (a, b)와 n의 배수로 형성 될 수있는 다음으로 가장 가까운 숫자의 차이를 찾으십시오.
Example:
n = 49, (a, b) = (13, 17) => Difference = 2
Nearest number would be = 51 (3*17, 0*13)
n = 16, (a, b) = (2 , 5) => Difference = 0
Nearest number would be = 16 (2*5, 3*2)
n = 25, (a, b) = (13, 17) => Difference = 1
Nearest number would be = 26 (0*17, 2*13)
이 문제를 어떻게 해결합니까?
내가 쓴 것은 : (루비에서)
def find_next_num_diff(x,y,z)
x, y = x > y ? [x, y] : [y, x]
while(z%y > 0 && z >= x) do
z -= x
end
if z%y == 0
return 0
else
return [y-(z%y), x-z].min
end
end
위의 코드는 마지막 종류의 예제에서는 작동하지 않습니다.
편집 : 음수 없음. 그리고 합계 만. 처음에 나는이에 대한 해결로이 문제를 생각 X & Y
방정식 Xa + Yb >= n
과X, Y > 0
다음과 같이 시작하겠습니다.
def find_next_num_diff(n, a, b)
multiples_of_a = (0..n+a-1).step(a).to_a
multiples_of_b = (0..n+b-1).step(b).to_a
multiples_of_a.product(multiples_of_b).map { |x, y| (n - (x + y)).abs }.min
end
find_next_num_diff(49, 13, 17)
#=> 2
find_next_num_diff(16, 2, 5)
#=> 0
find_next_num_diff(25, 13, 17)
#=> 1
또는 메모리에 데카르트 곱을 저장하지 않기 때문에 메모리가 덜 필요한 다음 구현을 사용할 수 있습니다.
def find_next_num_diff(n, a, b)
a_multiples = (0..n+a-1).step(a)
b_multiples = (0..n+b-1).step(b)
smallest = Float::INFINITY
a_multiples.each do |x|
b_multiples.each do |y|
smallest = [smallest, (n - (x + y)).abs].min
end
end
smallest
end
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다