我编写了一个程序来打印出所有数字,其二进制模式在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");
}
}
}
我只是无法理解为什么变量“i”在for循环之外的“k = 0”时不能增加到6,并且循环将一次又一次地重复。
答案 0 :(得分:3)
你的while循环增加k
。因此,在while循环中使用它之前,必须将其设置为0.如果不这样做,则从先前的计算中得到一个旧值。
答案 1 :(得分:2)
在“错误代码”中,k变量在迭代之间不会重置为0。然而,它会随着while循环的每次迭代而增加。在某些时候它会打破二进制[11]数组的上限,然后是“二进制[k ++] = n%2;”语句将开始覆盖堆栈上的其他变量,包括变量“i”。在这种情况下,会发生不可预测的事情。
如果你单步执行“错误的代码”,我相信你能够验证当i = 6时会发生这种情况。