Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印长度为N的所有二进制数_C - Fatal编程技术网

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

C 打印长度为N的所有二进制数,c,C,我以前在leetcode上做过这个问题,但我想在C中做。我想知道是否有人可以让我知道是否有更好的方法来做 #include <stdio.h> #include <stdlib.h> #include <string.h> void printBinaryLenthHelper(int currentLength, int maxLength, char accum[]) { if (currentLength == maxLength) { p

我以前在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);
}
#包括
#包括
#包括
void printBinaryLenthHelper(int-currentLength、int-maxLength、char-accum[]){
如果(currentLength==maxLength){
printf(“%s\n”,累计);
返回;
}
累计[当前长度++]=“0”;
printBinaryLenthHelper(currentLength、maxLength、accum);
累计[--currentLength]=“1”;
printBinaryLenthHelper(++currentLength,maxLength,accum);
}
无效打印二进制长度(整数长度){
字符累计[长度+1];
printBinaryLenthHelper(0,长度,累计);
}
int main(){
打印长度(20);
}

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

代码 测试


PS:如果您不了解
1的内容,则函数
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

,首先,您需要记住,C中的
char
字符串实际上被称为以null结尾的字节字符串。这个以null结尾的位很重要,而且您没有它(除了纯粹的运气)。未初始化的局部变量(包括数组),如
acum
,没有初始化,它们的值是不确定的(看起来是随机的)。这意味着,如果数组不是以
'\0'
(幸运的话)字符结尾,那么在打印字符串时,您将有一个字符串。请您澄清您想要的输出是什么?如何更好?这是非常主观的。我认为他要求打印所有20位的二进制数,从
0
1048575
?如果是这样,最好对整数使用二进制运算并格式化输出。
printf(.*s\n),currentLength,accum)
也可以工作,不需要NUL。或者NUL可以在顶级调用中插入一次。@rici:正确。我尽量使代码简单明了<代码>printf(“%s\n”,当前长度,累计)更简单,但需要更深入地理解
printf
的微妙之处。
0000000000
0000000001
0000000010
0000000011
0000000100
0000000101
0000000110
0000000111
0000001000
0000001001
0000001010
...
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);
}