向上计数并以二进制形式输入输入的整数

时间:2014-01-31 08:47:04

标签: c recursion binary

我正在尝试打印从0开始计数的输入整数的二进制数(例如0,1,10,11,100 ...到输入的数字)我已完成大部分编码我只是在努力我的打印二进制代码中的两个递归调用:它在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);

        }

    }
}

2 个答案:

答案 0 :(得分:0)

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);
    }
}

我告诉你上述功能的工作原理。

答案 1 :(得分:0)

更简单:

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);
  }
}