给定正整数N,打印1到2 ^ N之间的所有整数,使其二进制表示中没有连续的1。
我有以下代码,但有时打印重复。是否可以不重复打印?
#include <stdio.h>
int a[100];
void foo(int i, int size)
{
if (i >= size) {
int i;
for (i=0;i<size;i++)
printf("%d\n", a[i]);
printf("----\n");
return;
}
if (a[i-1] == 1 || a[i-1] == 0)
a[i] = 0;
foo(i+1, size);
if (a[i-1] == 0)
a[i] = 1;
foo(i+1, size);
}
int main(void) {
int i = 0;
int size = 5;
a[i] = 1;
foo(1, size);
return 0;
}
我有这个http://ideone.com/cT4Hco python程序,它使用哈希映射来打印元素,但我认为我们也可以在没有哈希映射的情况下执行此操作。
答案 0 :(得分:3)
几个笔记:
[0, n-1]
中的a
范围内a[0]
初始化为1
,因为a[0] = 0
也是有效案例。if (a[i-1] == 1 || a[i-1] == 0)
是多余的代码:
#include <stdio.h>
int a[100];
void foo(int i, int size)
{
if (i >= size) {
int i;
for (i=0;i<size;i++)
printf("%d ", a[i]);
printf("\n----\n");
return;
}
a[i] = 0;
foo(i+1, size);
if ( i == 0 || a[i-1] == 0) {
a[i] = 1;
foo(i+1, size);
}
}
int main(void) {
int i = 0;
int size = 5;
foo(0, size);
return 0;
}
您可能还希望在打印过程中过滤解决方案0 0 0 ... 0
,因为您只需要1
到2^n
的数字。如果包含2^n
,您还应该打印它。回溯考虑数字0, ...., 2^n-1