所以我无法弄清楚这一点。 (显然)
基本上,变量计数在开头声明,然后仅在一个地方修改或递增。预期的最终计数为78682
。当count等于,我将打印出字符串“ok
”。当count增加到78683
时,代码会检查条件并打印字符串“not ok
”。
它从不打印“not ok
”,但在最后打印计数值时,它是78683
!什么时候c ++增加了?
另一件事是,当评论在下面取消注释时,最终结果会变成78682
,但我只是不明白为什么。任何人? (哦,顺便说一句,代码需要一分钟才能运行....)
#include <stdio.h>
int main(){
int count=0, sum=0;
int length []={1,2,4,10,20,40,100,200};
int value [] ={200,100,50,20,10,5,2,1};
int tmp[8] ={0};
bool stop=false;
while(!stop){
sum=0;
for(int j=0,k=0; j<8; j++){
sum+=value[j]*tmp[j];
if(j==7){
if(sum==200){
count++;
if(count==73682) printf("ok\n");
if(count==73683) printf("not ok\n");
}
k=j;
tmp[k]++;
while(tmp[k]==length[k]+1){
tmp[k]=0;
k--;
tmp[k]++;
if(tmp[0]==2)
{
//tmp[0]--;
stop=true;
}
}
}
}
}
printf("Total %d.", count);
return 0;
}
答案 0 :(得分:3)
在我的电脑上我
ok
Total 73682.
两行都注释了行并且未注释该行。因此我无法调试它。
但最可能的假设是,你得到错误结果的原因是越界数组访问。如果你写tmp[anything]
它可以是内存中的任何位置,包括存储计数的地方。所以你需要检查0 <= anything && anything < 8
。你可以在这里访问:
while(tmp[k]==length[k]+1){
tmp[k]=0;
k--;
请添加安全检查以确保k >= 0
。
P.S。我添加了支票:
while(tmp[k]==length[k]+1){
tmp[k]=0;
k--;
if( k < 0 ) printf("oops\n");
我评论了这行
ok
oops
Total 73682.
线条取消注释我得到了
ok
Total 73682.
所以你可能在程序中还有其他一些错误。对不起,找不到。 (也知道程序想要做什么,你可以打印中间结果并检查它们。但如果你得到73683,你应该看到你的计算机超出界限。)