1

バイナリ パターンが 1 ~ 1993 の間で対称 (例: 1001001 、 1010101 ) であるすべての数字を出力するプログラムを作成しました。ただし、まだ理解できない詳細があります。

正しいコード:

#include <stdio.h>
main() {
    int binary[11] = {0};
    int i, n, j, k;
    for(i = 1; i <= 1993; i++) {
        n = i; k = 0;
        while(n != 0) {
            binary[k++] = n%2 ; 
            n = n/2;
        }   
        for(j = 0; j < k; j++) {
            if(binary[j] != binary[k-j-1])
            break;
        }   
        if(j == k) {
            printf("%d ", i);
            for(j = 0; j < k; j++)
                printf("%d", binary[j]);
            printf("\n");
        }   
    }
}

間違ったコード:

#include <stdio.h>
main() {
    int binary[11] = {0};
    int i, n, j, k = 0; /* I have found a mistake here, k=0 should inside the for loop */     
    for(i = 1; i <= 1993; i++) {
        n = i;
        while(n != 0) {
            binary[k++] = n%2 ; 
            n = n/2;
        }   
        for(j = 0; j < k; j++) {
            if(binary[j] != binary[k-j-1])
            break;
        }   
        if(j == k) {
            printf("%d ", i);
            for(j = 0; j < k; j++)
                printf("%d", binary[j]);
            printf("\n");
        }   
    }
}

forループの外側で「k = 0」のときに変数「i」が6に増えず、ループが何度も繰り返される理由がわかりません。

4

2 に答える 2

3

while ループが増加しkます。そのため、while ループで使用する前に、0 に設定する必要があります。そうしないと、前の計算からの古い値になります。

于 2012-06-09T17:23:32.873 に答える
2

「間違ったコード」では、反復間で k 変数が 0 にリセットされません。ただし、while ループの反復ごとに増加します。ある時点で、binary[11] 配列の上限を破り、「binary[k++] = n%2 ;」ステートメントは、変数「i」を含む、スタック上の他の変数の上書きを開始します。この状況では、予測できないことが起こります。

「間違ったコード」をステップ実行すると、i=6 のときにこれが発生することを確認できると思います。

于 2012-06-09T17:38:44.740 に答える