所以我无法弄清楚。 (明显)
基本上,变量计数在开始时声明,然后仅在一个位置修改或递增。预期的最终计数是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;
}
最佳答案
在我的电脑上
ok
Total 73682.
注释行和注释不行。因此,我无法调试它。
但是最可能的假设是,得到错误结果的原因是越界数组访问。如果编写
tmp[anything]
,它可以在内存中的任何位置,包括存储计数的位置。因此,您需要检查0 <= anything && anything < 8
。您可以在这里进行这样的访问: while(tmp[k]==length[k]+1){
tmp[k]=0;
k--;
请添加安全检查以确保
k >= 0
。附言我添加了支票:
while(tmp[k]==length[k]+1){
tmp[k]=0;
k--;
if( k < 0 ) printf("oops\n");
与行评论我得到
ok
oops
Total 73682.
没有注释的行我得到
ok
Total 73682.
所以可能您在程序中还有其他错误。抱歉,找不到。 (也知道程序要做什么,您可以打印中间结果并检查它们。但是,如果得到73683,则应该在计算机上看到无限制的访问权限)。