C编程十进制转二进制——递归方法中添加前导零

标签 c recursion binary formatting decimal

我有一个递归方法,可以在 C 中将十进制数转换为二进制数

long decimalToBinary(long n)
{
    if(n == 0) {
      return 0;
    } 
    else {
      return (10*decimalToBinary(n/2))+(n%2);

    }
}

它正在打印出正确的输出,但我试图让它在二进制数之前放置前导零(如果它不能被 4 整除),并以 4 为一组打印出来。 (例如100101100 -> 0001 0010 1100)

我正在考虑使用数组,而不是像现在这样返回答案,而是将其放入数组中并在 main() 方法中对其进行修改。然后我可以在开头添加一个空格并添加零。

有没有更好的方法来实现这一点?

最佳答案

decimalToBinary中,您可以创建一个char数组,而不是创建十进制值。此 char 数组将包含相反顺序的二进制数字,因此当您在 main 函数中打印该数组时,需要按相反顺序打印它们。

decimalToBinary 看起来像:

char *decimalToBinary(long n)
{
  int rem, mult = -1, i = 0, len = 5;
  char *arr = (char *) calloc(len, sizeof(char));

  // Loop until multiplier is not 0
  while (mult != 0) {
    mult = n / 2;
    rem = n % 2;
    n = mult;

    // If we are approaching end of string, increase its size
    if (mult != 0 && i == len) {
        len += 4;
        arr = (char *) realloc(arr, len);
    }

    arr[i++] = rem + '0'; // Convert int to char
  }
  arr[i] = '\0'; // End-of-string character

  return arr;
}

然后您可以从 main 调用此函数并按如下方式打印:

// Convert decimal to binary (char array)
char *arr = decimalToBinary(n);

// Print leading 0s
int len = strlen(arr);
int padding = (len % 4) == 0 ? 0 : 4 - (len % 4);
int count = 0;
while (padding > 0) {
    printf("0");
    --padding;
    ++count;
}

// Print the binary digits in reverse 
int i = len - 1;
while (i >= 0) {
    // Print a space after every 4 chars
    if (count > 0 && count % 4 == 0) {
        printf(" ");
    }

    printf("%c", arr[i]);
    --i;
    ++count;
}
printf("\n");

我已经尝试过这段代码并且它有效。例如,十进制数 280 将打印为 0001 0001 1000

关于C编程十进制转二进制——递归方法中添加前导零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062386/

相关文章:

c++ - 查找背包中带了哪些元素

在 C 中将 Ascii 转换为二进制

php - 如何在它所在的服务器上获取 php 二进制文件的路径

c - (C) 当以文本模式而不是二进制模式写入文件时,哪些字符会受到影响?

c++ - 如何判断一个文件是否已经关闭

c - 编译v4l2程序时ioport.h错误

c++ - 使用递归模板函数是否会引入函数调用开销,或者编译器是否在大多数情况下内联它(下面的示例)?

使用递归将一个基数转换为另一个基数

c - Int 和Float 指针。有人可以解释一下输出吗

c - 如何将套接字文件描述符放入缓冲区并继续接受传入连接?