思路分析:
两个水杯,一大一小,要么用小水杯一直装满水,然后倒入大水杯中,要么一直用大水杯装满水,倒入小水杯中。这里假设每装一次水,则计数一次。最后输入两种方案下装水次数最少的方案。
如果是小水杯装水,倒入大水杯中,那么就相当于用小水杯的倍数对大水杯取模,这样就得到一个循环数列。如果目标体积没有出现在这个数列中,说明这种方法不可行。同样如果是大水杯装水,倒入小水杯中,就相当于用大水杯的倍数对小水杯取模。比如说3 5 2。如果是3的倍数对5取模,得到的序列为3 1 4 2 0。如果是5的倍数对3取模,得到的序列为2 1 0。显然后者会先达到目标体积。
参考代码:
#include<stdio.h>
int PourWaterOne(int v1, int v2, int v)
{
int mv1,mv2,temp1,temp2;
int count;
//如果目标体积与已有体积相等,倒一次就可以了
if(v == v1 || v == v2)
return 1;
//保证v1比v2大
if(v1 < v2)
{
temp1 = v1;
v1 = v2;
v2 = temp1;
}
mv1 = v1;
mv2 = v2;
temp2 = mv2 % v1;
temp1 = mv1 % v2;
count = 1;
while(temp1 || temp2)
{
//用小体积的倍数模大体积
if(temp2 == v)
break;
mv2 += v2;
temp2 = mv2 % v1;
//用大体积的倍数模小体积
if(temp1 == v)
break;
mv1 += v1;
temp1 = mv1 % v2;
++count;
}
if(temp1 == v || temp2 == v)
return count;
else
return -1;
}
int main()
{
int v1,v2,v;
int n;
while(scanf("%d %d %d", &v1, &v2, &v) != EOF)
{
n = PourWaterOne(v1,v2,v);
if(n == -1)
printf("No\n");
else
printf("%d\n",n);
}
return 0;
}