题目:
有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。 问是否能够通过有限次操作,使得水缸最后恰好有C升水。输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 输出:0或1,表示能否达到要求。
函数头部:
c
1表示可以,0表示不可以 int can(int a,int b,int c);
c++
true表示可以,false表示不可以 bool can(int a,int b,int c)
java
true表示可以,false表示不可以 public class Main { public static boolean can(int a,int b,int c); }
思路:首先我想到的是,对于a、b、c,只有当c%(n*a+m*b)==0时,才可以做到,根据题可以得出,在C装满时,对a和b都进行了整数倍的操作,但是开始没想到一个好的算法,就进行了两个for循环,虽然结果可以做出来,但是超时,挑战失败,昨天在网上有看到欧几里得算法,看懂了原理之后,发现使用欧几里得算法,解决超时这个问题便很容易了。
源码如下:
import java.util.*;
public class Main
{
public static int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
public static boolean can(int a,int b,int c)
{
int x=gcd(a,b);
if(c%x==0) return true;
else return false;
}
public static void main(String[] args)
{
if(can(747,29,898862)) System.out.println("Can");
else System.out.println("Can't");
}
}