当前位置:   article > 正文

【C语言程序设计】穷举法典例------韩信点兵问题_c语言韩信点兵

c语言韩信点兵

【例】. 韩信有一队兵,他想知道有多少人,他让士兵排队报数,按从1到5报数,最末一个士兵报的数为1;按从1到6报数,最末一个士兵报的数为5;按从1到7报数,最末一个士兵报的数为4;最后再从1到11报数,最末一个士兵报的数为10.请编程计算韩信至少有多少兵。

【问题求解方法分析】设兵数为x,则按题意应满足以下关系式:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int x;
  5. for(x=0;x<3000;x++)
  6. {
  7. if(x%5==1 && x%6==5 && x%7==4 && x%11==10)
  8. {
  9. printf("x = %d\n",x);
  10. }
  11. }
  12. return 0;
  13. }

运行结果:

 这里我们是假设韩信有3000兵,属于“瞎猫碰到死耗子”,如果真正的解不在这个范围内,那么程序运行之后将一无所有。如果没有x<3000的限制条件,那么又是怎样的结果呢?显然一定会找到正解,而且不止一个正解,更严重的是程序将进入一个死循环。所以这个时候我们就可以用break语句程序如下:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int x;
  5. for(x=0;;x++)
  6. {
  7. if(x%5==1 && x%6==5 && x%7==4 && x%11==10)
  8. {
  9. printf("x = %d\n",x);
  10. break;
  11. }
  12. }
  13. return 0;
  14. }

由于本例中,程序退出循环以后什么事情也不做,直接结束程序的运行,因此还可以调用函数exit()来直接结束程序的运行。程序如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. int x;
  6. for(x=0;;x++)
  7. {
  8. if(x%5==1 && x%6==5 && x%7==4 && x%11==10)
  9. {
  10. printf("x = %d\n",x);
  11. exit(0);
  12. }
  13. }
  14. return 0;
  15. }

可读性更好的方法是使用标志变量,即定义一个标志变量find,标志是否找到了解,先置find为假,表示“未找到”一旦找到了满足给定条件的解,就将find置为真,表示“找到了”。相应的,循环控制表达式取为“find的逻辑非”的值,当find值为0时,即!find为真,表示没找到,继续循环,否则表示已找到,退出循环,程序如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. int x;
  6. int find=0;
  7. for(x=1;!find;x++)
  8. {
  9. if(x%5==1 && x%6==5 && x%7==4 && x%11==10)
  10. {
  11. printf("x = %d\n",x);
  12. find = 1;
  13. }
  14. }
  15. return 0;
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/771130
推荐阅读
相关标签
  

闽ICP备14008679号