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 回答