C语言:百钱百鸡:普通-优化-超级版(循环嵌套)三大方法实现!

【问题】百钱百鸡:公鸡一只五块钱,母鸡一只三块钱,小鸡三只一块钱,问:用一百块钱买一百只鸡,公鸡,母鸡,小鸡各几只?
分析:

       初步设想公鸡、母鸡、小鸡的数量分别为x、y、z.因所买3种鸡的数量为100只,可以使用三重循环从1到100分别试算。不使用其他算法分析,可直接编写程序,一类鸡的数量都可以从 0到100再判断鸡的总数和用钱的总数是否等于100,若100,则找到一个答案:否则继续变化各类鸡的数量,重新试算。

【普通版】百钱百鸡!!!
include <stdio.h>
int main() 
{
     int x,y,z;
     for(x=0;x<=100;x++)                                      /*循环前,令x=0,当x<=100时进行循环,每轮循环结束x的值加1*/
         {
               for (y=0;y<=100;y++)                           /*循环前,令y=0,当y<-100时进行循环,每轮循环结束y的值加1*/
                      {
                           for (z=0;z<=100;z++)               /*循环前,令z=0,当z<=100时进行循环,每轮循环结束z的值加1*/
                               {
                                                                           /*条件判断x+y+x 表示3种鸡的总数,x*5+y*3+z/3表示购买3种鸡所花的钱,如果都为100,则满足条件*/
                                     if (z%3==0 && x+y+z==100 &&x*5+y*3+z/3==100)
                                     printf("公鸡: %d,母鸡: %d,小鸡: %d\n",x,y,z);                         /*输出x,y,z 的值*/
                               }
                        }
            }
     getch();

     return 0;
}


运行结果:
公鸡:0,小鸡:  25,母鸡:  75
公鸡:4,小鸡:  18,母鸡:  78
公鸡:8,小鸡:  11,母鸡:  81
公鸡:12,小鸡:  4,母鸡:  84


思考:
     公鸡单价为5块钱,则100钱最多只能买20 只:母鸡单价为了3钱,100钱最多只能买33只。
    另外,鸡的总数为100,则在试算过程中,只要公鸡和母鸡数确定了,小鸡数直接100-x-y即可得到,不需要再使用第三层循环来处理了。


【优化版】百钱百鸡!!!
#include <stdio.h>
int main()
{
       int x,y,z;
       for(x=0;x<=20;x++)                                                    /*循环前,令x=0,当x<=20时进行循环,每轮循环结束x的值加1*/
       {
             for(y=0;y<=33;y++)                                              /*循环前, 令y=0,当y<-33时进行循环,每轮循环结束y的值加1*/
             {
                   z=100-x-y;                                                      /*z的数量即为100减去其他两种鸡的数量*/
                   if (z%3==0 && x*5+y*3+z/3==100)                /* 条件判断*/
                   printf("公鸡: %d, 母鸡: %d, 小鸡: %d\n",x,y,z);
        }
        getch();
        return 0;
}

       由以上两个程序的比较可知,在循环嵌套中,尽量减少嵌套的层数,可提高程序效率。但是,由于现在计算机的运行速度越来越快,程序员也应注意不要过度追求程序效串,而使程序很难读懂。
例如,将程序改写为下面的形式:


【超级版】百钱百鸡!!!
include <stdio.h>
int main()
{
       int x,y,z;
       for(x=0; x<-=12: x+=4)
      {
             y=25-(x/4)*7;
             z=100-x-y;
             printf("公鸡:%d,母鸡: %d,小鸡1:%d\n",x, y, z);
       }
getch();
return 0;
}


  ▲以上程序也可以得到正确答案,并且只有一层循环,程序效率明显提高了。但是,特别是初学者,看着以上程序能简单地弄懂其算法吗??

猜你喜欢

转载自blog.csdn.net/weixin_44015669/article/details/89739954