现在的位置: 首页 > 综合 > 正文

倒水问题1

2017年10月17日 ⁄ 综合 ⁄ 共 820字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.