第四周 程序跳转
1.接力break
输入x元,输出用多少个1角,2角,5角来凑成x元
1 #include<stdio.h> 2 3 int main() 4 { 5 int x; 6 int one, two, five; 7 8 scanf("%d", &x); 9 for ( one = 1; one < x*10; one++) { 10 for (two = 1; two < x*10/2; two++) { 11 for ( five = 1; five < x*10/5; five++) { 12 if (one + two*2 + five*5 == x*10) { 13 printf("%d one + %d two + %d five = %d\n", one, two, five, x); 14 } 15 } 16 } 17 } 18 19 return 0; 20 }
输入2元,输出:
1 one + 2 two + 3 five = 2
1 one + 7 two + 1 five = 2
2 one + 4 two + 2 five = 2
3 one + 1 two + 3 five = 2
3 one + 6 two + 1 five = 2
4 one + 3 two + 2 five = 2
5 one + 5 two + 1 five = 2
6 one + 2 two + 2 five = 2
7 one + 4 two + 1 five = 2
8 one + 1 two + 2 five = 2
9 one + 3 two + 1 five = 2
11 one + 2 two + 1 five = 2
13 one + 1 two + 1 five = 2
假如我只需要一种方法就可以了, 怎么输出一种方案后就停止呢?
如果在13行后,加条break;程序没有什么变化。为什么会这样呢?break只会跳出最内层的for语句。
那么在13,15,16行都加break,假如只这样的话,内层结束后,总会执行break。
所以要加个条件限制,设置一个变量 int exit = 0; 然后在 break 前加 exit = 1;
1 #include<stdio.h> 2 3 int main() 4 { 5 int x; 6 int one, two, five; 7 int exit = 0; 8 9 scanf("%d", &x); 10 for ( one = 1; one < x*10; one++) { 11 for (two = 1; two < x*10/2; two++) { 12 for ( five = 1; five < x*10/5; five++) { 13 if (one + two*2 + five*5 == x*10) { 14 printf("%d one + %d two + %d five = %d\n", one, two, five, x); 15 exit = 1; 16 break; 17 } 18 } 19 if (exit) break; 20 } 21 if (exit) break; 22 } 23 24 return 0; 25 }
这样的结果就是
1 one + 2 two + 3 five = 2
2.goto
或者用goto语句也可以达到这样的效果:
1 #include<stdio.h> 2 3 int main() 4 { 5 int x; 6 int one, two, five; 7 8 scanf("%d", &x); 9 for ( one = 1; one < x*10; one++) { 10 for (two = 1; two < x*10/2; two++) { 11 for ( five = 1; five < x*10/5; five++) { 12 if (one + two*2 + five*5 == x*10) { 13 printf("%d one + %d two + %d five = %d\n", one, two, five, x); 14 goto out; 15 } 16 } 17 } 18 } 19 out: 20 return 0; 21 }
goto特别合适这样的场合,跳出多重循环。别的场合使用的时候要慎重。