【问题标题】:count up towards and printing an entered integer number in binary向上计数并以二进制形式打印输入的整数
【发布时间】:2014-01-31 08:47:03
【问题描述】:

我正在尝试打印输入的整数的二进制数,从 0 开始计数(例如 0,1,10,11,100... 到输入的数字)我已经完成了大部分编码,我只是在苦苦挣扎我的 print Binary 代码中的两个递归调用:它一次打印出每个数字 1 或 0,直到它需要转到下一行。我想知道是否有人可以查看我的代码并告诉我应该做什么? 代码:

#include <stdio.h>

int biggestPower2(int);

void printBinary(int, int);

int main()
{
    int i;
    int input;
    printf("Enter the number to count up to: ");
    scanf("%d", &input);
    for (i = 0; i<=input; i++)
    {

        printBinary(i, biggestPower2(i));
    }
}

int biggestPower2(int decimal)
{
    if ((decimal == 0)||(decimal == 1))
    {
        return 1;
    }
    else
    {
        return 2*biggestPower2(decimal/2);
    }
}

void printBinary(int decimal, int power2)
{
    int nextDigit;
    if (power2 == 1)
    {
        printf("%d\n", decimal);
    }
    else
    {
        nextDigit = decimal/power2;
        printf("%d", nextDigit);
        if (nextDigit == 1)
        {
            printBinary(decimal%2, power2/2);
        }
        else
        {
            printBinary((decimal)%2, power2/1);

        }

    }
}

【问题讨论】:

  • 你进入了无限递归。使用调试器,一步一步执行你的程序,你就会明白为什么了。
  • 顺便说一句,这里没有理由使用递归。
  • 这不是无限递归,数字只是不正确(除非我把它复制到这个错误),我也知道它不需要,但它是我的当然需要我
  • 其实你是对的,不是无限递归。整个算法都是错的。

标签: c recursion binary


【解决方案1】:

printBinary 函数的正确表示应该如下:

printBinary(a,b) = if(b==1) print a
                   if(a>b) print "1" 
                   else print "0"
                   printBinary(a%b, b/2)

where the initial b is largest power of 2 less than equal to a.                   

你从小于给定数字的最高功率开始。如果它小于当前数字,则设置该位,否则不设置。然后用余数 a%b 和下一个幂 b/2 调用相同的函数。

修改后的代码应该如下:

void printBinary(int decimal, int power2)
{
  if (power2 == 1)
  {
      printf("%d\n", decimal);
      return;
  }
  printf("%d", decimal/power2);
  printBinary(decimal%power2, power2/2);
}

顺便说一句,要找到2 小于或等于n 的最大幂,您可以简单地这样做:

 long int largest_powr_less_than_n = pow(2.0,floor(log(n)/log(2)))

而不是编写一个单独的(太递归了!)函数。

编辑:

一个更简单的递归实现如下所示:

void printBinary(int decimal)
{
    if(decimal<=1)
      printf("%d", decimal);
    else
    {
      printBinary(decimal/2);
      printf("%d", decimal&1);
    }
}

我把上面的函数如何工作留给你。

【讨论】:

    【解决方案2】:

    更简单:

    void printBinary(int decimal, int power2)
    {
      int nextDigit;
      if (power2 == 1)
      {
          printf("%d\n", decimal);
      }
      else
      {
          nextDigit = decimal/power2;
          printf("%d", nextDigit);
          printBinary(decimal%power2, power2/2);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 2011-07-12
      • 1970-01-01
      • 2010-11-20
      • 2012-02-23
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      相关资源
      最近更新 更多