龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

一个有趣的问题的C语言编程

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
问题:有两个没有刻度的8两的酒瓶和一个可以没有刻度的3两的酒杯,现在有16两酒要平均分给4个人喝,怎么分配? 这个问题网上有很多人讨论过,我看过一篇文章写出了比较具体的

问题:有两个没有刻度的8两的酒瓶和一个可以没有刻度的3两的酒杯,现在有16两酒要平均分给4个人喝,怎么分配?

这个问题网上有很多人讨论过,我看过一篇文章写出了比较具体的C程序,但十分繁复。我对这个问题做了简单的思考写出了一个简单的程序,这个程序只能产生分配方法中的几种解法,但非常轻易理解。

源程序如下:

#include"stdio.h"

  int a,b,c,d,x,y,v,j;

  void show()

  {

   printf("甲 %d,乙 %d,丙 %d,丁 %d,瓶一 %d,瓶二 %d,酒杯 %d→第%d步。

",a,b,c,d,x,y,v,j);

   j++;

  }

  void make()

  {

   v=0;

   x=3;

   show();

   v=3;

   y=y-3;

   show();

   v=0;

   x=6;

   show();

   y=y-3;

   v=3;

   show();

   x=8;

   v=1;

   show();

  }

  void assign()

  {

   x=x-3;

   v=v+3;

   show();

   a=a+3;

   v=v-3;

   show();

   x=x-3;

   v=v+3;

   show();

   d=x;

   x=0;

   show();

  }

  void main()

  {

   int i;

   j=1;

   a=b=c=d=v=i=0;

   x=y=8;

   show();

   assign();

   while(x=0,x+y+v>8)

   {

   make();

   i=i+1;

   v=0;

   if(i=1)

   {

   a=4;

   }

   if(i=2)

   {

   b=1;

   }

   if(i=3)

   {

   c=1;

   }

   show();

   v=3;

   y=y+(x-3);

   x=0;

   show();

   if(x+y+v<=8)

   break;

   }

   b=b+v;

   v=0;

   show();

   y=y-3;

   v=v+3;

   show();

   c=c+v;

   v=0;

   show();

   d=d+y;

   y=0;

   show();

  }

由于VC++6.0在编写源程序时十分方便,所以我即使写C程序也习惯使用VC++6.0,这个程序是在VC++6.0上运行通过。

这个简单的算法是循环产生1两酒,因为只要产生1两的情况,那些就十分轻易分配了。

谁有更简单又能产生更多分配情况的好程序请贴出来,让大家分享一下!谢谢。

  

精彩图集

赞助商链接