-1

次の行に沿って for ループを開始することを考えています。

for(int i = 0; i <= 20, i++){ 


    if i = 1; 


       i --;

` そして、i = 0 の場合を考慮すると、問題が発生します。2 つの可能性のあるケース、つまり、print i = 0 または print i = 1 があります。これは、再帰的に定義されることがわかります。ビットは前の桁に基づいて定義されます。

4

2 に答える 2

0

私はあなたの質問を明確に理解していませんでしたが、「11、111、111などのブロックなしで、1から(1<<20)までのすべての整数」を取得したいと思っていると思います。

もしそうなら、これはコードです:

for(int m = 0x55555; m <= 0xAAAAA; m <<= 1) {
  int x = m;
  do {
    printf("x=0x%05x\n", x);
  } while(x = (x - 1) & m);
}
于 2013-10-29T00:57:37.887 に答える
0

私がそれをよく理解していれば、連続した 1 を含まない 20 ビット パターンごとに生成する必要があります。たとえば、00000000000000000001有効ですが、そうで00000000000000000011はありません。

これは自然に再帰的な問題です。これは、各ノードが 1 または 0 のいずれかであるツリーのように考えることができます。1 のノードは 1 つの子 (ビット 0) しか持つことができず、0 のノードは 2 つの子を持つことができます。別の 0 になります。絵的には、次のように機能します。

ビットツリー

深さが 20 に達するまで、ツリーはこのように拡大しCUTOFFます。将来変更する可能性があるため、この値を と呼びます。コードの背後にあるアイデアは、まさにツリーによって伝えられるアイデアです。

#include <stdio.h>
#define CUTOFF 20

char buffer[CUTOFF+1];

void print_bits(char next_bit, unsigned char count) {
    buffer[count] = next_bit + '0';
    if (count == CUTOFF-1) {
        buffer[CUTOFF] = '\0';
        printf("%s\n", buffer);
        return;
    }
    print_bits(!next_bit, count+1);
    if (next_bit == 0)
        print_bits(next_bit, count+1);
}

の場合は複数回出力する必要があるため、ビット文字列を含むバッファーを保持しますnext_bit == 0。バッファは、ルートから現在のノードまでのパスを知る方法であり、各ノードはその深さに対応する位置にのみ書き込むことができます (によって追跡されcountます)。

次の方法でパーティーを開始できます。

int main(void) {
    print_bits(0, 0);
    print_bits(1, 0);
    return 0;
}

の値が非常に大きいCUTOFF(255 より大きい) 場合は、countからunsigned charに変更することをお勧めしintます。

このコードは、定義上、00000000000000000000有効なエントリであることに注意してください。常に少なくとも 1 が必要な場合は、このケースを無視する必要があります。strcmp()再帰の基本ケースで使用してテストできますが、それは非効率的です。もう 1 つの考えられる方法は、書き込んだ数のカウンターを保持し、基本ケースでその値をテストすることです (または、フラグを使用して、少なくとも "1" が書き込まれたかどうかを示します)。

于 2013-10-29T10:50:08.073 に答える