所以我无法弄清楚。 (明显)

基本上,变量计数在开始时声明,然后仅在一个位置修改或递增。预期的最终计数是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,则应该在计算机上看到无限制的访问权限)。

10-07 23:16