题目:波瓦松的分酒趣题。法国著名数学家波瓦松青年时代研究过一个有趣的数学问题:某人有12品脱的啤酒一瓶,想从中倒出6品脱,但他没有6品脱的容器,仅有一个8品脱和一个5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?
要求格式:
Input Full a,Empty b,c,Get i: 12 8 5 6
a12 b8 c5
12 0 0
4 8 0
4 3 5
9 3 0
9 0 3
1 8 3
1 6 5
6 6 0
a12 b5 c8
12 0 0
7 5 0
7 0 5
2 5 5
2 2 8
10 2 0
10 0 2
5 5 2
5 0 7
0 5 7
0 4 8
8 4 0
8 0 4
3 5 4
3 1 8
11 1 0
11 0 1
6 5 1
6 0 6
我的代码:(amax,bmax,cmax代表三瓶的最大容量。a,b,c代表三瓶中的酒量)
#include<stdio.h>
void Give(int* a,int* b,int* c,int which,int amax,int bmax,int cmax)
{
if(which==*a)//c->a
{
*a+=*c;
*c=0;
printf("%4d%4d%4d\n",*a,*b,*c);
}
else if(which==*b)//a->b
{
*b=*a;
if(*b>bmax)
{
*b=bmax;
*a-=bmax;
}
else
{
*a=0;
}
printf("%4d%4d%4d\n",*a,*b,*c);
}
else if(which==*c)//b->c
{
*c=*b;
if(*c>cmax)
{
*c=cmax;
*b-=cmax;
}
else
{
*b=0;
}
printf("%4d%4d%4d\n",*a,*b,*c);
}
else
{
printf("progrom wrong");
}
}
int main()
{
printf("Input Full a,Empty b,c,Get i:\t");//i为最后结果
int a,b,c,i=6;
int amax,bmax,cmax;
a=12,b=0,c=0;
amax=12,bmax=8,cmax=5;
printf(" a%d b%d c%d\n%4d%4d%4d\n",amax,bmax,cmax,a,b,c);
do{
Give(&a,&b,&c,b,amax,bmax,cmax);//a->b
if(a==i && b==i)
break;
Give(&a,&b,&c,c,amax,bmax,cmax);//b->c
if(a==i && b==i)
break;
Give(&a,&b,&c,a,amax,bmax,cmax);//c->a
if(a==i && b==i)
break;
Give(&a,&b,&c,c,amax,bmax,cmax);//b->c
}while(a!=i && b!=i);
a=12,b=0,c=0;
amax=12,bmax=5,cmax=8;
printf(" a%d b%d c%d\n%4d%4d%4d\n",amax,bmax,cmax,a,b,c);
do{
Give(&a,&b,&c,b,amax,bmax,cmax);//a->b
if(a==i && b==i)
break;
Give(&a,&b,&c,c,amax,bmax,cmax);//b->c
if(a==i && b==i)
break;
Give(&a,&b,&c,a,amax,bmax,cmax);//c->a
if(a==i && b==i)
break;
Give(&a,&b,&c,c,amax,bmax,cmax);//b->c
}while(a!=i && b!=i);
return 0;
}
debug的结果:打完断点后,一按debug就三行0