C编程十进制到二进制 - 将前导零添加到递归方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C编程十进制到二进制 - 将前导零添加到递归方法相关的知识,希望对你有一定的参考价值。

我有一个递归方法将十进制数转换为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] = ''; // 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("
");

我已经尝试了这个代码,它的工作原理。例如,十进制数280将打印为0001 0001 1000

以上是关于C编程十进制到二进制 - 将前导零添加到递归方法的主要内容,如果未能解决你的问题,请参考以下文章

oracle forms 12. 如何显示十进制数的前导零

中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零

二进制的前导的零——mooc《零基础学Java语言》-(浙大翁凯)期末编程题

转换为二进制并保留前导零

在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串

将 int 转换为带前导零的十六进制