Преобразование числа из одной базы в другую с помощью рекурсии

Поэтому у меня возникли проблемы с созданием рекурсивной функции для преобразования числа из оснований 2-10 в основания 2-16. Мне нужно, чтобы он возвращал строку (очевидно, из-за оснований больше 10).

вот моя функция:

main назвал бы это так:

answer = baseConversion(101, 10, 2);

У меня есть hex как постоянный символ:

const char Hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

char * baseConverter(int number,int currbase, int base){

    if(currbase != 10){

        number = base10Converter(number, currbase);  //converts the number to base of 10 

        currbase = 10;
    }

    if(number == 0 || base==10){

        return number;

    }

    int r = number%base;

    printf("%c", Hex[r]);

    //return (number % base) + 10*baseConverter(number /base, currbase, base); // this gives the answer as an integer.
    return Hex[r]+ && baseConverter(number /base, currbase, base) // I dont know what to add here to add the characters together 
}

Мне нужна помощь с моим оператором возврата и рекурсивным вызовом. Нужно ли мне объявлять массив символов внутри функции, а затем добавлять к нему символы, которые я получаю из hex[r]? Если да, то как мне это сделать, потому что я не могу изменить параметры


person mrquiksilver    schedule 18.10.2014    source источник
comment
каково содержание функции base10Converter   -  person Alper Cinar    schedule 19.10.2014


Ответы (1)


  • У int нет оснований, у них есть только значения. То, как вы отображаете или представляете строку, имеет основу. Таким образом, нет смысла использовать currBase, если вы не начали со строкового представления значения, которое хотите преобразовать.
  • baseConverter определяется так, что возвращает строку; поскольку для этой строки не передано место, его придется выделить.
  • Таким образом, для рекурсивного случая вы должны вызвать baseConverter, чтобы получить строку для остальной части числа, и использовать ее для создания новой строки (которую вам нужно выделить), убедившись, что освободите строку, которую вы получили от рекурсивного вызова, когда закончите.
person Scott Hunter    schedule 18.10.2014
comment
Спасибо за ответ. Что касается вашего третьего пункта, о котором вы упомянули, мне пришлось выделить память для укуса в моей функции (baseConverter). Однако мне было интересно, вернул ли я strncmp(hex[r], baseConverter(...)); это сработает? если нет, как бы я поступил по-вашему. @Скотт Хантер - person mrquiksilver; 20.10.2014
comment
strcat(hax[r], baseConverter(...)); я имею в виду - person mrquiksilver; 20.10.2014
comment
strcat нужна строка для конкатенации, что означает, что эта строка должна быть выделена в какой-то момент. Кроме того, предполагается, что вы выделили достаточно места для конкатенации. Наконец, strcat требует объединения строки, а не символа. - person Scott Hunter; 20.10.2014