5.2.2 从嵌套的循环跳出

如何用1角,2角,5角的硬币凑出10元以下的金额.像这样的题,其实是计算机最擅长的,因为其实就是把可能性一个个枚举出来.因此我们需要怎么做这个程序呢?首先需要三个代表各种硬币个数的变量,o,t,f,然后程序读入输入金额m.我们要把这三种不同的面额组合起来拼凑出结果,因此我们需要三个循环,循环条件都是不能大于转化为元时不能大于金额,每经过一次循环都让他循环变量加1.判断三种硬币加起来是否等于金额,等于就打印结果,不等于就继续循环.代码如下:

#include
int main(){
    int o,t,f;
    int m=0; 
    printf("请输入金额m\n");
    scanf("%d",&m);
    for(o=1;o<=m*10;o++){
      for(t=1;t<=m*10/2;t++){
        for(f=1;f<=m*10/5;f++){
            if(o*1+t*2+f*5==m*10){
            printf("可以用%d个1角%d个2角%d个5角组成%d元\n",o,t,f,m);
            
                    }
    
                }

            }
    
        }
    
    }

\n是种美德,不过我没有! 这个\n是第一次运行之后才加上去的.以后记得在这种很多个输出的时候适当换行.

如果现在我们相对程序进行修改,需要程序在满足一次输出之后就退出循环.那我们可不可以在printf后面直接加上break退出循环呢.不行.他还是给了我们很多个输出结果.在printf后面加上break意思是,在执行第三个循环的时候,每有一个满足就退出循环,后面其他结果都不要,回到第二个循环,自加后,继续第三个循环.break和continue都是只能对他所在的那层循环做事.那既然这样,直接在其他两层循环也分别加一个break不就好了,让他完成第一次输出之后从第三个循环break到第二个,再break到第一个不就行了.实际上,这样的结果是,无论什么情况,输出或者没输出第一个结果,他在执行完第三个循环就会到第二个break,然后到第一个循环的break,也就是跳出所有循环.那我们可以定义一个变量exit=0;在它打印第一个结果的时候,让exit=1;跳出第一个循环;再在第二个break前加上if(exit)(if(exit==1))表示如果exit为1就break,第三个break也是如此.代码如下:

        

#include
int main(){
    int o,t,f;
    int m=0;
    int exit =0; 
    printf("请输入金额m\n");
    scanf("%d",&m);
    for(o=1;o<=m*10;o++){
      for(t=1;t<=m*10/2;t++){
        for(f=1;f<=m*10/5;f++){
            if(o*1+t*2+f*5==m*10){
            printf("可以用%d个1角%d个2角%d个5角组成%d元\n",o,t,f,m);
                exit=1;
                break; 
            }

                
}
    if(exit)break; 
}
    if(exit)break;     
    }
    
}

上面这种手段我们叫接力break,常用于多重循环的跳出.而在像上面这种特定的题目,我们还有一个好朋友能帮我们做到这件事,goto.代码如下:

#include
int main(){
    int o,t,f;
    int m=0; 
    printf("请输入金额m\n");
    scanf("%d",&m);
    for(o=1;o<=m*10;o++){
      for(t=1;t<=m*10/2;t++){
        for(f=1;f<=m*10/5;f++){
            if(o*1+t*2+f*5==m*10){
            printf("可以用%d个1角%d个2角%d个5角组成%d元\n",o,t,f,m);
            goto out;
            }

                
}

}

    }
out:;    
}

goto可以让我们在第一次打印之后就直接跳到out,结束所有循环.很多教材会很害怕教大家goto,因为goto在历史上有个不好的名声,觉得goto破坏了程序的结构性,可以随便goto到这里那里.实际上,goto在某些特定场合还是比较好用的,像是用于跳出这种多层嵌套的循环.

你可能感兴趣的:(算法,数据结构,c语言)