思路分析:
两个水杯,一大一小,要么用小水杯一直装满水,然后倒入大水杯中,要么一直用大水杯装满水,倒入小水杯中。这里假设每装一次水,则计数一次。最后输入两种方案下装水次数最少的方案。
如果是小水杯装水,倒入大水杯中,那么就相当于用小水杯的倍数对大水杯取模,这样就得到一个循环数列。如果目标体积没有出现在这个数列中,说明这种方法不可行。同样如果是大水杯装水,倒入小水杯中,就相当于用大水杯的倍数对小水杯取模。比如说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; }