我之前在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);
}
答案 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
。