【问题标题】:C programming decimal to binary - adding leading zero to recursive methodC编程十进制到二进制 - 在递归方法中添加前导零
【发布时间】:2018-08-10 06:29:36
【问题描述】:

我有一种递归方法可以在 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() 方法中对其进行修改。然后我可以在开头添加一个空格并添加零。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 有 - 使用 char 数组。好吧,您提到了它,您无法直接使用某些标准函数将其转换为二进制。
  • 感谢@coderredoc。我在使用数组时遇到的问题是我不知道我将拥有多大的数字。这是一个随机输入。我如何制作一个没有预定大小的数组?
  • 这个问题有一个众所周知的解决方案 - 在开始时动态分配内存,以便它可以容纳最大位数(根据您的应用程序的需要),然后以防进一步需要扩展或缩小重新分配.我想说的不止是 100 个元素 char 就足够了。
  • "我不知道我会有多大的数字" --> 可以使用类似ceil(log(LONG_MAX)/log(2))
  • 获取tour、阅读How to Askminimal reproducible example。您显示的代码不打印任何内容。您的decimalToBinary 函数接受一个二进制数并返回一个二进制数。 int binary=10; // decimal to binary!。您的代码将数字 10 十进制 (0x0a b1010) 转换为 1010 十进制(0x03f2 或 b1111110010),您的调试器可能正在为您将其转换为十进制,但这通常是可配置的。橡胶符合您实际编写代码以将二进制值转换为 1 和 0 的字符串的道路,并包括漂亮的东西,如前导 'b'、半字节组和零填充。

标签: c recursion binary formatting decimal


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2013-05-10
    • 2015-01-11
    • 2015-03-09
    • 2016-05-03
    相关资源
    最近更新 更多