加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

百元百鸡问题(基于C语言)

(2012-11-25 18:30:27)
标签:

杂谈

经典算法

c语言

百钱百鸡

分类: 数据结构与算法

百元百鸡问题

    很久没有写博文了,今天分享下个人刚刚接触过的一个比较基础的算法思想,题目如下:

    中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

 

   题目分析与算法设计:

   题目中提及所需购买的总的鸡只数目为100只,话费100元,所以我们可以设置公鸡x只,母鸡y只,小鸡z只,可得到方程:x+y+z=100……① 5x+2y+z/3=100……②,所以问题也就变成了解决不定方程的组的整数解了,这样思路也就渐渐明了,由于程序与实际操作的解答不定方程组的解不同,在程序中多采用穷举法对程序进行遍历以求得相应的方程解,根据对穷举的范围不同可以分为以下这几种方法。 

   算法一:若购买公鸡,最多可以购买20只,所以x的范围0~20;若购买母鸡最多33只,所以y的范围0~33;若购买的都是小鸡最多可以购买100只,所以z的范围0~100,程序相应如下,

          for(x=0;x<=20;x++)
         {
             for(y=0;y<=33;y++)
             {
                  for(z=0;z<100;z++)
                  {
                       if(x+y+z == 100 && x*5+y*3+z/3.0 == 100 )  //此处注意应该是3.0,而不是3,理由:如果是除于3会出现取整情况,影响结果,具体操作就会明白的
                      {
                             printf("公鸡为-,母鸡为-,小鸡为-\n",x,y,z);
                       }
                   }
              }
         }
 

   算法二:在算法一的基础上,由方程①得到:z=100-x-y;对其进行的穷举程序也可以相应减少一层循环,详情见下,

      #include <stdio.h>
     void main()
     {
           int x,y,z,j=0;
           printf("Folleing are possible plans to buy 100 fowls with 100 Yuan.\n");
           for(x=0;x<=20;x++)

           {
                 for(y=0;y<=33;y++)
                 {
                       z=100-x-y;
                       if(z%3==0&&5*x+3*y+z/3.0==100)

                       printf("-:cock=- hen=- chicken=-\n",++j,x,y,z);
                  }

           }
      }

 

     以上两种方法只是实习百元百鸡中鸡的种类无要求的运算,若要求每种鸡至少一只,除了对以上算法循环初始值改为1,还可以有以下两种:

     算法三:同样的由方程①和②可得14x+8y=200方程,由此可得x的范围为:1~13;y的范围为
:1~23,可以采用两重循环解决

     算法四:由方法三中方程14x+8y=200得到7x+4y=100,由此相应的x范围为:1~13;y的取值限制为关系式y=(100-7x)/4;可以采取一重循环可以解决问题。

 

突然发现总结这些还不是很完整的,也许有更好的,如果有友友有更好的方法可以相互分享,嘻嘻


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有