先看看题目:
有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。
可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。 问是否能够通过有限次操作,使得水缸最后恰好有C升水。
输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 输出:0或1,表示能否达到要求。
看到这一题,想到曾经做的一个题目,具体忘记了,说得大概是只猴子(具体忘了,不影响题意)要去一个目标距离为c的地点,可以选择一般的跳,和超级跳两个距离分别是a、b,当然,可以选择向前或向后跳。
当时的思路就是直接将a,b辗转相除得到最大公约数,然后再将c取余最大公约数,为0的话就可以到达目的,否则不可;
不过今天我忘记了为什么会是这样额,于是参考了一下别人的意见(http://www.th7.cn/Program/c/201309/148378.shtml)希望作者不要怪我啊...
这是我自己的想法:
我们已知我们有A,B升的两个容器,假设A > B,那么每次可以倒的水的量为A , B ,( A - B)升水,设置3个因子,分别为x1 , x2, x3,如果可以使得水缸最后恰好有C升水,那么必然存在整数x1 , x2, x3,使得Ax1 + Bx2, + (A - B)x3 = C 等式成立;
即(x1 + x3 )A + (x2- x3 )B = C ;
实际上xA + yB = C即可(其中涉及到的参数即为整数);
假设A,B的公约数是K,那么xA + yB = nK = C;
所以将C取余K即可;
好了,思想就到这了,贴出代码:
#include <stdio.h>
#include <stdlib.h>
int HighestCommon(int m, int n)
{
int temp;
while(m)
{
temp = m;
m = n % m;
n = temp;
}
return n;
}
int can(int a, int b, int c)
{
int temp;
temp = HighestCommon(a, b);
if(c % temp == 0)
return 1;
else
return 0;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
printf("%d", can(5, 2, 9));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
如果不理解的大家继续讨论...
欢迎大牛指点...o(∩_∩)o