로그를 사용한 결정론적 기본 변환

소개



이 기사는 Ruby로 작성된 10진수에서 8진수로의 변환기 코딩 문제에 대한 몇 가지 솔루션을 안내합니다.
참고: 이 솔루션은 두 번째 함수 매개변수를 추가하고 모든 8을 지정된 매개변수로 대체하여 10진수를 10보다 작은 밑으로 변환하기 위해 일반화할 수 있습니다.

솔루션 1: 표준 방식



밑을 변환하는 한 가지 간단한 방법은 입력 숫자와 대상 밑num % 8의 모듈로를 반복적으로 취한 다음 숫자가 비게 될 때까지num /= 8 입력 숫자를 대상 밑while num > 0으로 나누는 것입니다. 각 모듈로 결과는 배열에 추가되거나 아래 예와 같이 결과 숫자로 합산됩니다.

def octal_convertor(num)
  octal = 0
  i = 1
  while num > 0
    octal += (num % 8) * i 
    num /= 8
    i *= 10
  end
  return octal
end


이 솔루션은 각 반복에서 i = 1씩 증가하는 변수i *= 10를 사용합니다. num % 8를 곱하는 데 사용되므로 octal += (num % 8) * i의 다음 정수 위치로 이동합니다. num에서 밑수 8자리를 잘라서 octal의 다음 정수 위치에 넣는 것과 같이 생각할 수 있습니다.

해결 방법 2: 대수를 사용한 결정론적 반복



임의의 진수(이 경우 8진수)의 자릿수(자릿수)는 Math.log(num,8).floor + 1로 계산할 수 있습니다. 이것은 num % 8 로 '슬라이싱'해야 하는 자릿수 또는 필요한 루프 반복 횟수를 나타냅니다. 따라서 if num > 0 를 확인할 필요가 없으며 루프를 정확한 횟수만큼 실행할 수 있습니다.

def octal_convertor(num)
   octal = 0
   (Math.log(num,8).floor + 1).times do |i|
     octal += (num % 8) * 10**i
     num /= 8
   end
   return octal
end

.times 메서드는 블록을 수락하고 반복 횟수를 |i|에 전달합니다. 따라서 사전에 정확한 반복 횟수를 아는 것 외에도 이전 솔루션의 'i' 변수는 .times에 의해 제공됩니다. |i|는 0부터 증가하므로 8진수를 올바른 위치에 삽입하려면 (num % 8)10**i를 곱합니다.

해결 방법 3: 배열로서의 숫자



이 한 줄짜리는 위와 거의 같은 방식으로 작동하지만 길이가 8진수인 새 배열을 만듭니다(따라서 각 8진수 자리가 있음). .timesArray.new와 유사하게 배열의 각 값을 무언가로 채울 수 있는 블록을 허용합니다. 이 블록은 인덱스 값|i|을 받습니다.

def octal_convertor(num)
  Array.new(Math.log(num,8).floor + 1) {|i| ((num / 8**i) % 8) * 10**i }.sum
end

numnum /= 8 로 가변 분할되지 않습니다. 대신 'i'를 사용하여 분할되어야 하는 횟수num / 8**i 또는 현재 반복이 있는 8진수 자리 값을 계산합니다. 10**i는 이전에 언급한 것과 정확히 동일하게 작동합니다. 이제 배열에는 10**i 를 곱한 모든 8진수 숫자가 포함되어 합산했을 때 올바른 위치에 맞도록 추가된 0의 올바른 개수를 제공합니다. .sum 배열의 모든 숫자를 더하여 변환된 숫자를 반환합니다.

결론



로그를 사용하여 숫자 자릿수 길이를 계산하면 반복 횟수를 미리 결정하고 while 루프를 사용하는 대신 열거 가능한 객체(배열, 숫자)를 반복할 수 있습니다.

좋은 웹페이지 즐겨찾기