Ryan Thomsen Ответов: 2

Как можно было бы преобразовать восьмеричное число в десятичное без цикла while


В моем компьютерном задании одно из требований при преобразовании между базовыми системами счисления состоит в том, чтобы не использовать никаких циклов? Как бы вы преобразовали восьмеричное целое число в двоичное без цикла while?
Edit: я могу получить входные данные в виде строки или int в c++. В зависимости от того является более целесообразным в порядке. Т. е. Я могу попросить ввести восьмеричное число. Введите восьмеричное число. Затем установите этот вход на все, что мне нужно, чтобы преобразование для печати десятичного числа работало. Где я зацикливаюсь на том, как выполнить преобразование без использования какой-либо формы цикла. Кроме того, мне нужно иметь возможность конвертировать в шестнадцатеричный формат, но я надеюсь, что если я смогу понять этот шаг, то смогу сам закодировать все остальное.

Что я уже пробовал:

Я пробовал использовать операторы if, но не знаю, как решить, сколько их использовать для каждого преобразования.

Rick York

Определите "восьмеричное целое число" и "двоичное число"." Это важно, потому что вы не определили условия преобразования. Если это два фрагмента двоичных данных, то преобразование не требуется. Если один из них является строкой, а другой-нет, это отличается от того, если оба являются строками. Очень, очень важно быть точным в своих определениях и терминологии, потому что неправильное толкование может привести к большим ошибкам.

Patrice T

Покажите свою работу, чтобы получить помощь.

CPallini

- Я пробовал использовать петли if, но я теряюсь в том, как узнать, сколько их использовать."
Такого понятия не существует. Поссинли вы пытались использовать если цепи.
Кстати, вы можете попробовать использовать оператор switch.

2 Ответов

Рейтинг:
2

Stefan_Lang

Я должен спросить: ваши лекции уже сходились? рекурсия Потому что если это так, то это единственный способ, которым я могу придумать, как это сделать без петли.

Если бы это было не так, то я думаю, что ограничения, которые вы разместили, не совсем корректны, поскольку любая специальная функция или синтаксис, которые вы могли бы использовать, включали бы внутренний петля, по крайней мере.

Вот примерный план в псевдокоде для рекурсивного подхода:

string convert_char_to_bin(char octal_char)
{
   // see solution 1
}
string remove_first(string my_string)
{
   // remove first char and return remainder of my_string
}
string convert_octal_to_binary(string octals) {
   return octals.empty() ? "" : convert_char_to_bin(octals[0] + convert_octal_to_binary(remove_first(octals);
}

Технически это соответствовало бы условиям, хотя использование тернарного оператора"?", возможно, также не было тем, что хотел видеть ваш учитель.


Ryan Thomsen

Это из первого задания моего класса. Мне уже говорили:
1. Никаких "если" заявления.
2. Нет "а" заявления.
3. Не "для" отчетности.
4. Не "делать" заявления.
5. Никакой "переключатель" заявления.
6. никаких "условных" утверждений.

Я предполагаю, что на основе первоначальной формулировки рекурсия не будет разрешена, поскольку это циклические операторы, но я спрошу.

Stefan_Lang

Если это действительно ваше первое задание, я сомневаюсь, что ваш учитель хотел, чтобы вы написали рекурсивное решение - тем более, что обычно вам нужно было бы "если" просто проверить инициализацию рекурсии (ввод без каких-либо окталей в нем). Это напомнило мне, что в моем псевдокоде отсутствовала именно эта проверка, поэтому я обновил свое решение, включив его, и использовал тернарный оператор"?", чтобы избежать необходимости в "если".

Однако я подозреваю, что ваш наставник хотел увидеть что-то другое, и вам лучше всего проверить заметки из вашей лекции(лекций): она должна включать в себя любую технику, которую ваш наставник имел в виду.

Единственное решение "первого уровня назначения", которое я могу придумать, - это развернуть цикл в последовательность шагов.

Рейтинг:
0

OriginalGriff

Ну, основная единица восьмеричного числа - это цифра, которая всегда имеет одинаковую длину: три бита: 000, 001, 010, 011, 100, 101, 110, 111 - восемь возможных значений, отсюда и название "восьмеричное".

Поэтому напишите простую функцию, которая берет восьмеричную цифру и преобразует ее в двоичную - есть множество различных способов сделать это: цепочка ifс собой switch, или (наиболее эффективный) массив строк-это три, которые приходят на ум при повышении эффективности. Проверьте это, и когда он у вас работает, переходите к извлечению цифр из целого числа: это также просто, поскольку в C++ есть операторы Shift (>> и <<), а также оператор маскировки и оператор &
Таким образом, чтобы извлечь наименее значимую цифру, вы должны были бы и число с 7 (или 111 двоичными числами) отбросить все остальные цифры.
Чтобы извлечь следующую наименее значимую цифру, вы сдвигаете ее вправо на три места (чтобы отбросить наименее значимую цифру) и заменяете ее на 7
Следующая-это сдвиг вправо на шесть, и еще один и.
И так далее для остальных цифр.
Так как вы знаете, сколько восьмеричных цифр в вашем числе - размер целого числа устанавливает это - вы можете вызвать функцию, которую вы создали ранее несколько раз, извлекая каждую цифру, как вы идете без использования цикла.

Попробуйте: это проще, чем кажется!