C 打印长度为N的所有二进制数
我以前在leetcode上做过这个问题,但我想在C中做。我想知道是否有人可以让我知道是否有更好的方法来做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
#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);
}