2016-10-06 4 views
0

私は0000000000とZZZZZZZZZZの間のすべての可能な英数字の組み合わせを実行するプログラムを持っています。現在、私はこのコードを使用しています:どのようにこれらのループを短縮しますか?

for (digit[0] = 0; digit[0] < 36; digit[0]++) 
    for (digit[1] = 0; digit[1] < 36; digit[1]++) 
     for (digit[2] = 0; digit[2] < 36; digit[2]++) 
      // etc... 

を...そして最終的にはそこにループの10ネストされていると私の全体のエディタ画面が満たされています。だから私はこれをループのために1つか2つに凝縮するのですか? digit[i]のテストとインクリメントをどのように組み合わせるかはわかりません。このソリューションをお持ちの方にはありがとうございます。私は百万のWebページがこれにあると確信していますが、Google検索でどのようにフレーズするかを考えることはできませんでした。

+3

あなたは組み合わせの数が、それは、この非現実的 –

+0

http://www.catb.org/jargon/html/R/recursion.html – wildplasser

+0

@OlegAndriyanovええ、それは永遠に取るなり伴い、それが理由の一つだ実現します私はここでもっと良い方法が必要です –

答えて

2

オドメータアルゴリズムを使用してください。最後の桁をインクリメントします。それが最高値に達すると、数値がなくなるまで0に折り返し、残りの数字を再帰します。

int increment_digit(int array[], unsigned int index, limit) { 
    if (index == -1) { // We've wrapped around the entire set 
     return 0; 
    } 
    array[index]++; 
    if (array[index] == limit) { 
     array[index] = 0; 
     return increment_digit(array, index-1, limit); 
    } else { 
     return 1; 
} 

int main(int argc, char **argv) { 
    int digits[SIZE] = {0}; 
    while (1) { 
     // do stuff ... 
     if (!increment_digit(digits, SIZE-1, 36)) 
      break; 
     } 
    } 
    return 0; 
} 
+1

最初の呼び出しは 'SIZE-1'でなければなりません – Barmar

+0

数字か文字のどちらかを印刷する関数を作った。このコードでどこに追加する必要がありますか? –

+2

'do stuff ... ' – Barmar

0

ここでは、再帰関数を使用する1つのソリューションがあります。使用している配列のタイプのようなものを想定しなければならないので、少し修正する必要があります。

また、forループが1回だけ実行されると、オーバーフローすることに注意してください。

void incDigit(int *digits) { 
    digits[0]++; 
    if(digits[0] >= 36) { 
    digits[0] = 0; 
    incDigit(digits + 1); 
    } 
} 

int digits[10]; 
int i, j; 
for(i = 0; i < (int)pow(36, 5); i++) { 
    for(i = 0; i < (int)pow(36, 5); i++) { 
    //Code here 
    incDigit(digits); 
    } 
} 
+3

' pow(36,10) 'が' MAX_INT'より大きいので 'for()'ループは32ビットシステムでは動作しませんので、 'i Barmar

+0

@Barmar面白い点。 'pow'は' double'を返します。 AFAIKは 'int'と' double'を比較すると 'double'にキャストされます。したがって、 'int'を' double'にキャストするときに、精度の低下によっていくつかの重複(または欠落)反復が存在する可能性が高くなります。 –

+1

最終的に 'i'が' MAX_INT'に到達すると、次の反復で 'i ++'が実行され、 'i'のオーバーフローが発生します。 – Barmar

関連する問題