倒水

题目详情:

有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。

我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。

可以进行的操作是:

  1. 把一个容器灌满;

  2. 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);

  3. 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。

   问是否能够通过有限次操作,使得水缸最后恰好有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);

}

答题说明:

main函数方便自行编译测试,可不完成。


import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
    public static boolean can(int a,int b,int c) {
            
        if(c % b == 0 || c % a == 0) return true;
            
        int diff = Math.abs(a-b);
        if(diff != 0) {
            if(c % diff == 0) return true;
            //if(diff %c == 0) return true;           
            if(c > b) {
                if((c - b) % diff == 0) return true;
                if((c - b) % a == 0) return true;
            }
            if(c > a) {
                if((c - a) % diff == 0) return true;  
                if((c - a) % b == 0) return true;            
            }
        }
            
        if(c > (a + b)) {
           if(c % (c - (a+ b)) == 0 ) return true;
        }
        //if(Math.abs(c - a) % b ==  0)  return true;
        //if(Math.abs(c - b) % c ==  0)  return true;
        
        
        if(a > b) {
            if(a % b != 0) {
                if (c % ( (a / b + 1) * b - a) == 0) return true;
            }
        }
        if(b > a) {
            if(b % a != 0) {
                if (c % ( (b / a + 1) * a - b) == 0) return true;
            }
        }
        
        return false;
    }
        
     //start 提示:自动阅卷起始唯一标识,请勿删除或增加。
     public static void main(String args[])
    {
        System.out.println(can(1234567, 7654321, 9999999));
        System.out.println(can(9,5,2));
    }
    //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}