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

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

       初步设想公鸡、母鸡、小鸡的数量分别为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;
}


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

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

濯一一

你的鼓励:我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值