C 递归或提取变量

C 递归或提取变量,c,recursion,C,Recursion,我正在做一个从十进制到任意基数的转换器。我必须使用递归,并且需要打印前导零。我希望打印零,而不重复。我会在我的实际函数中调用它,但我不知道如何从中得到递增的x。请帮忙 zero_int是一个辅助函数,它只需打印所需数量的零即可 i、 e 当我尝试将1288转换为十进制时,得到的结果是000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我正在做一个从十进制到任意基数的转换器。我必须使用递归,并且需要打印前导零。我希望打印零,而不重复。我会在我的实际函数中调用它,但我不知道如何从中得到递增的x。请帮忙

zero_int是一个辅助函数,它只需打印所需数量的零即可

i、 e 当我尝试将1288转换为十进制时,得到的结果是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100001000

我想得到的是000000000000000101000011000

我发现这是因为每次递归调用都会重复放置前导零,这会创建太多的前导零,但我不知道如何解决这个问题。

如果选中“32-x>0”,则添加一个额外的if复选框

如果选中“32-x>0”,则添加一个额外选项


另一种方法是,使用预先计算的大小(所需的最大位数)数组,预先初始化为“0”:

#include "stdio.h"

void base_aux(unsigned int n, unsigned int base, unsigned int x)
{

    if (n > (base - 1) || 32 - x > 0) {
        base_aux(n / base, base, ++x);
        printf("%u", n % base);
    }
    else {
        printf("%u", n);
    }

}

void binary_int(unsigned int n)
{
    base_aux(n, 2, 0);
}

int main()
{
    binary_int(5);
}

你被迫使用递归?好的,您可以使用base_aux2…

另一种方法,使用预先计算大小的数组(需要最大位数),预先初始化为“0”:

#include "stdio.h"

void base_aux(unsigned int n, unsigned int base, unsigned int x)
{

    if (n > (base - 1) || 32 - x > 0) {
        base_aux(n / base, base, ++x);
        printf("%u", n % base);
    }
    else {
        printf("%u", n);
    }

}

void binary_int(unsigned int n)
{
    base_aux(n, 2, 0);
}

int main()
{
    binary_int(5);
}

你被迫使用递归?好的,您可以使用base_aux2获得它…

仅考虑base 2(二进制):

问题在于调用zero_int函数的位置。您需要确保只调用一次,并且使用正确的x值

像下面这样修改代码应该最有效:

static char const characters[36] = "0123456789abcdefghijklmnopqrstuvwxyz";

void base_aux2(unsigned int n, unsigned int base, char* end)
{
    if(n != 0)
    {
        *--end = characters[n % base];
        base_aux2(n / base, base, end);
    }
}

void base_aux(unsigned int n, unsigned int base)
{
    if(base > sizeof(characters))
    {
        printf("base %u exceeding max of %lu", base, (unsigned long) sizeof(characters));
        return;
    }

    unsigned int digits = 0;
    unsigned int tmp = UINT_MAX;
    while(tmp)
    {
        tmp /= base;
        ++digits;
    }

    char buffer[digits];
    memset(buffer, '0', sizeof(buffer));

#if 0
    char* end = buffer + sizeof(buffer);
    while(n > 0)
    {
        *--end = characters[n % base];
        n /= base;
    }
#else
    base_aux2(n, base, buffer + sizeof(buffer));
#endif

    printf("%.*s\n", (int)sizeof(buffer), buffer);
}

仅考虑基数2(二进制):

问题在于调用zero_int函数的位置。您需要确保只调用一次,并且使用正确的x值

像下面这样修改代码应该最有效:

static char const characters[36] = "0123456789abcdefghijklmnopqrstuvwxyz";

void base_aux2(unsigned int n, unsigned int base, char* end)
{
    if(n != 0)
    {
        *--end = characters[n % base];
        base_aux2(n / base, base, end);
    }
}

void base_aux(unsigned int n, unsigned int base)
{
    if(base > sizeof(characters))
    {
        printf("base %u exceeding max of %lu", base, (unsigned long) sizeof(characters));
        return;
    }

    unsigned int digits = 0;
    unsigned int tmp = UINT_MAX;
    while(tmp)
    {
        tmp /= base;
        ++digits;
    }

    char buffer[digits];
    memset(buffer, '0', sizeof(buffer));

#if 0
    char* end = buffer + sizeof(buffer);
    while(n > 0)
    {
        *--end = characters[n % base];
        n /= base;
    }
#else
    base_aux2(n, base, buffer + sizeof(buffer));
#endif

    printf("%.*s\n", (int)sizeof(buffer), buffer);
}

什么?举例说明你得到了什么,为什么不够好,你想要什么。我已经更新了问题以提供这些澄清假设基数是3,4,7,8或36-为什么在这些情况下你需要32-x零?如果你只使用基数2(二进制),那么使用这样的计算可能有一定的公平性,尽管我仍然相信你的计算是正确的(你也是如此,因为如果一切正常,你不会问这个问题)。这是指令的一部分。我需要确保32位被代表什么?举例说明你得到了什么,为什么不够好,你想要什么。我已经更新了问题以提供这些澄清假设基数是3,4,7,8或36-为什么在这些情况下你需要32-x零?如果你只使用基数2(二进制),那么使用这样的计算可能有一定的公平性,尽管我仍然相信你的计算是正确的(你也是如此,因为如果一切正常,你不会问这个问题)。这是指令的一部分。我需要确保32位被表示