Целое число в цепочку Vigesimal - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь преобразовать int в восьмеричное основание, которое равно 20. Система числового значения - это основание 20. Цифры: «0»,.,., '9', 'A',.,., 'J'.Я написал код на языке C, чтобы выполнить преобразование из Int в Vigesimal Base.Но я не получаю правильный вывод.Ниже мой код.

 #include <stdio.h>
 #include <stdlib.h>

  int main()
 {
printf("Hello world!\n");
itov('hey',30);
return 0;
}

  void itov(char vigesimalStr [],int n)
{
char base_digits[21] =
     {'0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F','G','H','I','J'};

 int  index=0;
 int base=20;

 while (n != 0)
 {
       vigesimalStr[index]= n % base;
       n = n / base;
       ++index;
 }

 /* now print the result in reverse order */
 --index;  /* back up to last entry in the array */
 printf("\n\nConverted Number = ");
for(  ; index>=0; index--) /* go backward through array */
{
      printf("%c", base_digits[vigesimalStr[index]]);
}
printf("\n");

}

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Этот код работает с положительными числами:

#include <stdio.h>
#include <stdlib.h>

static void itov(char vigesimalStr[], int n);

int main(void)
{
    int tests[] = { 30, 0, 1, 19, 20, 21, 399, 400, 401, 379341, };
    enum { NUM_TESTS = sizeof(tests) / sizeof(tests[0]) };

    printf("Hello world!\n");

    for (int i = 0; i < NUM_TESTS; i++)
    {
        char result[32];
        itov(result, tests[i]);
        printf("%6d = %5s base 20\n", tests[i], result);
    }

    return 0;
}

static void itov(char vigesimalStr[], int n)
{
    char base_digits[20] =
    {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
    };

    int index = 0;
    int base = 20;

    do
    {
        vigesimalStr[index++] = base_digits[n % base];
        n = n / base;
    } while (n != 0);

    vigesimalStr[index--] = '\0';
    for (int i = 0; i < index; i++, index--)
    {
        char t = vigesimalStr[i];
        vigesimalStr[i] = vigesimalStr[index];
        vigesimalStr[index] = t;
    }
}

Выходные данные:

Hello world!
    30 =    1A base 20
     0 =     0 base 20
     1 =     1 base 20
    19 =     J base 20
    20 =    10 base 20
    21 =    11 base 20
   399 =    JJ base 20
   400 =   100 base 20
   401 =   101 base 20
379341 = 27871 base 20

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

Обработка отрицательных чисел сложнее - вполне выполнимо, но сложнее, потому что в обычных системах с двумя дополнениями нельзя отрицать INT_MIN и получите положительное значение.Вы можете отрицать любое положительное значение, а затем обработать его.

0 голосов
/ 05 марта 2019

Первая ошибка: (может быть и больше)

itov('hey',30);
/*   ^   ^     */

Прежде всего одинарные кавычки используются для литералов символов типа int.Вы должны использовать двойные кавычки для строкового литерала, который совместим с char [] (фактически истощается до char *).Тип такого строкового литерала: const char [SIZE].

Во-вторых, поскольку тип литералов равен const, вам необходимо передать изменяемый массив char.

Например:

char converted[20] = {0};
itov(converted,30);

-

Вы должны объявить тип itov перед первым использованием как нормальный и избегать неприятных сюрпризов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...