C 递归或提取变量
我正在做一个从十进制到任意基数的转换器。我必须使用递归,并且需要打印前导零。我希望打印零,而不重复。我会在我的实际函数中调用它,但我不知道如何从中得到递增的x。请帮忙 zero_int是一个辅助函数,它只需打印所需数量的零即可 i、 e 当我尝试将1288转换为十进制时,得到的结果是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100001000 我想得到的是000000000000000101000011000 我发现这是因为每次递归调用都会重复放置前导零,这会创建太多的前导零,但我不知道如何解决这个问题。如果选中“32-x>0”,则添加一个额外的if复选框 如果选中“32-x>0”,则添加一个额外选项C 递归或提取变量,c,recursion,C,Recursion,我正在做一个从十进制到任意基数的转换器。我必须使用递归,并且需要打印前导零。我希望打印零,而不重复。我会在我的实际函数中调用它,但我不知道如何从中得到递增的x。请帮忙 zero_int是一个辅助函数,它只需打印所需数量的零即可 i、 e 当我尝试将1288转换为十进制时,得到的结果是000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
另一种方法是,使用预先计算的大小(所需的最大位数)数组,预先初始化为“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位被表示