打印所有长度为N的二进制数

时间:2018-08-25 05:22:54

标签: c

我之前在leetcode上做了这个问题,但想在C语言中进行。想知道是否有人可以让我知道是否有更好的方法来解决这个问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printBinaryLenthHelper(int currentLength, int maxLength, char accum[]) {
  if (currentLength == maxLength) {
    printf("%s\n", accum);
    return;
  }

  accum[currentLength++] = '0';
  printBinaryLenthHelper(currentLength, maxLength, accum);

  accum[--currentLength] = '1';
  printBinaryLenthHelper(++currentLength, maxLength, accum);
}


void printBinaryLength(int length) {
  char accum[length + 1];
  printBinaryLenthHelper(0, length, accum);
}

int main() {
  printBinaryLength(20);
}

2 个答案:

答案 0 :(得分:0)

您可以通过简单地从0迭代到2^n -1来避免递归。此范围表示所有二进制长度为n的数字(假设较小的数字用前导零填充)。

代码

#include <stdio.h>

void printBinary(int len) {
    //This loop iterates from 0 to 2^len - 1
    for(int i = 0; i < 1 << len; ++i) {
        //This loop is to print the integer in its binary representation.
        for(int j = len - 1; j >= 0; --j) {
            //  ((1<<j)&i) > 0 evaluates to 1 if the jth bit is set, 0 otherwise
            printf("%d", ((1<<j)&i) > 0);
        }
        printf("\n");
    }
}

int main(void) {
    // your code goes here
    printBinary(10);
    return 0;
}

输出

0000000000
0000000001
0000000010
0000000011
0000000100
0000000101
0000000110
0000000111
0000001000
0000001001
0000001010
...

经过测试的here

PS :如果您不了解1<<j(1<<j)&j的含义,请阅读C中的按位运算符。

答案 1 :(得分:0)

函数printBinaryLenthHelper中存在问题:在将字符串传递给printf之前,您不可以将其终止为null。递增和递减currentLength也是一个令人困惑的副作用,只是在递归调用中传递下一个值。

这是更正的版本:

void printBinaryLenthHelper(int currentLength, int maxLength, char accum[]) {
    if (currentLength == maxLength) {
        accum[currentLength] = '\0';
        printf("%s\n", accum);
        return;
    }
    accum[currentLength] = '0';
    printBinaryLenthHelper(currentLength + 1, maxLength, accum);
    accum[currentLength] = '1';
    printBinaryLenthHelper(currentLength + 1, maxLength, accum);
}

还要注意,名称应为printBinaryLengthHelper