簡體   English   中英

打印非連續方式的數量

[英]Print number of ways for non-consecutive one's

給定正整數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程序,該程序使用哈希圖來打印元素,但我認為我們也可以在沒有哈希圖的情況下執行此操作。

幾個注意事項:

  • 您不應該從索引1開始回溯。相反,請從0開始,因為您的數字將在數組a中處於[0, n-1]范圍內
  • 您不應該將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 ,因為只需要12^n的數字即可。 如果包含2^n則還應該打印它。 回溯考慮數字0, ...., 2^n-1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM