Задача:
Дано число d в десятичной системе счисления. Требуется написать функцию, которая преобразует это число в его двоичную запись:
- 510 = 1012
- 810 = 10002
Основная программа должна иметь доступ к преобразованному число, нельзя просто вывести его внутри функции.
Решение:
1. Подумаем над прототипом функции, которую нам нужно написать. Так как двоичные числа могут быть очень длинными, то будем возвращать ответ в виде строки. Вернуть строку, созданную внутри функции, мы не можем из-за ограничения области видимости переменных. Остаётся два варианта:
- Вернуть указатель на динамически созданный массив char.
- Принять в качестве аргумента массив char и изменять его.
Первый вариант не очень удобен, т. к. после вызова функции нужно будет не забыть освободить память по возвращённому указателю. Во втором же варианте ничего удалять не нужно. Итак, прототип нашей функции:
void dectobin(long long d, char *b);
2. Если входное число ноль, то ответ очевиден (0). Заполняем массив символом нуля и символом окончания строки, т. к. строки в C должны им заканчиваться (потому что строка - это массив char, а переменная массива в C - всего лишь указатель на его начало).
if (d == 0) {
b[0] = '0';
b[1] = '\0';
}
else {
// ...
}
3. Алгоритм перевода десятичного числа в двоичное следующий:
- Делим с остатком число на 2 пока не получим ноль.
- Записываем остатки от делений в обратном порядке.
Возникает проблема с записью числа в обратном порядке. Т. е. нам нужно заранее знать длину двоичного числа, чтобы заполнять массив задом наперёд. Чтобы узнать её, давайте будем делить число на 2, пока не получим 0, увеличивая счётчик на 1.
Создадим переменную i - длина числа и temp - в которую поместим значение d, т. к. в результате делений мы исходное число превратим в 0, а оно нам ещё нужно:
int i = 0;
long long temp = d;
for (i = 0; temp > 0; temp = temp / 2, i++);
3. Теперь i - длина будущего двоичного числа.
Обозначим конец числа, поместив в следующую за последней цифрой ячейку (a[i], т. к. нумерация массива с 0) символ окончания строки \0.
Заполняем массив остатками от деления исходного числа на 2 и делим это число на 2, не забывая при этом уменьшать значение счётчика на 1, чтобы двигаться по массиву к его началу.
Также, нам нужно преобразовать остаток от деления типа int в тип char. Для этого посмотрим в таблицу Хаски ASCII и увидим, что коды всех цифр идут по порядку, начиная с 0. Таким образом, если к коду символа 0 мы прибавим 0 или 1 (наш остаток), то мы получим искомый символ.
b[i] = '\0';
while (d > 0) {
i -= 1;
b[i] = '0' + (d % 2);
d /= 2;
}
Готово! Теперь строковая переменная b после вызова функции будет содержать двоичную запись числа d.
Вот полный код программы с примером использования функции:
#include <stdio.h>
void dectobin(long long d, char *b)
{
if (d == 0) {
b[0] = '0';
b[1] = '\0';
}
else {
int i = 0;
long long temp = d;
for (i = 0; temp > 0; temp = temp / 2, i++);
b[i] = '\0';
while (d > 0) {
i -= 1;
b[i] = '0' + (d % 2);
d /= 2;
}
}
}
int main()
{
long d;
char b[255];
scanf("%ld", &d);
dectobin(d, b);
printf("%s", b);
return 0;
}
Комментарии 1