Программа, которая меняет число с базы n на другую базу m - PullRequest
0 голосов
/ 27 марта 2020

Мне было просто интересно, как изменить число с числовой базы m на другую базу n с помощью программы Ruby, а не драгоценного камня. Кто-нибудь сделал это и хотел бы поделиться своими мыслями или идеями? Просто подумал, что было бы интересно попробовать такую ​​программу:)

Я сделал это для bin в de c, de c в bin, dex в hex, hex в de c, но хотел бы знать, как это сделать от m до n.

def bin2dec(num)
  sum = 0
  i = 0

  while i < num.length
    sum += 2 ** i * num[num.length - i - 1].to_i
    i += 1
  end

  return sum
end

bin = gets.chomp
out = bin2dec(bin)
print out

def dec2bin(dec)
  out = ""
  num = dec

  while num != 0
    out = "#{num % 2}" + out
    num = num / 2
  end
  return out
end

dec = gets.to_i
print dec2bin(dec)

Ответы [ 4 ]

1 голос
/ 28 марта 2020

Для 11 <= n <= 36, Ruby имеет соглашение, которое позволяет целым числам быть выраженными в базе n с 10 цифрами 0-9 и первыми n-10 символами алфавита. Именно по этой причине мы получаем следующие результаты: представление целых чисел

1270.to_s(36) #=> "za"
"za".to_i(36) #=> 1270

1270.to_s(37) #=> ArgumentError (invalid radix 37)
"za".to_i(37) #=> ArgumentError (invalid radix 37)

Ruby, однако, является всего лишь соглашением.

Я буду иметь дело только с отрицательные целые числа и будем называть их «числами». Отрицательные целые числа могут быть отрицаны, преобразованы в число другого основания, а затем это число отрицается.

Мы могли бы express чисел любого основания в виде массивов цифр, где каждое ди git выражается как основание 10 целое число. Например, мы могли бы написать:

  • 46 в базе 10 как [4, 6]
  • za в базе 36 как [36, 10]
  • два -di git номер основания N как [n, m], где n и m находятся между 0 и N-1.

Мы можем написать метод для преобразования базы Число 10 в этом представлении массива:

def base10_to_base_n(n10, radix)
  arr = []
  while n10 > 0
    n10, rem = n10.divmod(radix)
    arr << rem
  end
  arr.reverse
end

base10_to_base_n(123, 10)
  #=> [1, 2, 3]
base10_to_base_n(131, 2)
  #=> [1, 0, 0, 0, 0, 0, 1, 1]
abase10_to_base_n(1234, 16)
  #=> [4, 13, 2]
base10_to_base_n(9234, 99)
  #=> [93, 27]

Обратите внимание, что в третьем примере:

4*(16**2) + 13*(16**1) + 2*(16**0) #=> 9234

Далее мы создайте метод, который делает обратное: преобразует число в заданной базе, описываемое как массив цифр (аргумент base_n), в число из базы 10.

def base_n_to_base_10(base_n, radix)
  pow = 1
  arr = base_n.reverse
  base_n.reverse.reduce do |n10, digit|
    pow *= radix
    n10 + digit*pow
  end
end

base_n_to_base_10([1, 2, 3], 10)
  #=> 123
base_n_to_base_10([1, 0, 0, 0, 0, 0, 1, 1], 2)
  #=> 131 
base_n_to_base_10([4, 13, 2], 16)
  #=> 1234 
base_n_to_base_10([93, 27], 99)
  #=> 9234 

Как и ожидалось, если

radix  = 87
n10    = 6257
base87 = base10_to_base_n(n10, radix)
  #=> [71, 80]

, то:

base_n_to_base_10(base10_to_base_n(n10, radix), radix)
  #=> 6257
base10_to_base_n(base_n_to_base_10(base87, radix), radix)
  #=> [71, 80]
1 голос
/ 28 марта 2020

Если вам нужен метод, который преобразует любое положительное основание в любое другое положительное основание, начните смотреть на Целое число # цифры . Он принимает аргумент (по умолчанию 10), но ничто не мешает вам получить число в базе 543.

1 голос
/ 27 марта 2020

Эти функции встроены.

Чтобы преобразовать "EFFE" из основания 16 (шестнадцатеричное) в основание 8 (восьмеричное) ...

"EFFE".to_i(16).to_s(8) 
# => "167776" 

Чтобы поместить это в метод ...

def convert_base(string, from_base, to_base)
  string.to_i(from_base).to_s(to_base)
end
0 голосов
/ 27 марта 2020

Если вы хотели сделать это без встроенных методов ...

def convert_base(string, from_base, to_base)
  characters = (0..9).to_a + ('A'..'Z').to_a
  string = string.to_s.upcase.gsub(/[^0-9A-Z]/i, '') # remove non alphanumeric
  digits = string.split('')
  decimal_value = digits.inject(0){|sum, digit| (sum * from_base) + characters.find_index(digit) }
  result = []
  while decimal_value > 0
    result << characters[decimal_value % to_base]
    decimal_value = decimal_value / to_base
  end
  result = result.join.reverse
  return result if result.length > 0
  '0'
end

convert_base('effe', 16, 8)
# => "167776"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...