倒水
有两个容器,容积分别为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); }
答案自己写的仅供参考
#include <vector> #include <map> #include <iostream> using namespace std; typedef vector<int> vectTemp; bool Can(int a,int b,int c) { int nMax = a; int nMin = b; if(a<b) { nMax = b; nMin = a; } vectTemp MaxCan; vectTemp MinCan; MinCan.push_back(0); MinCan.push_back(nMin); MinCan.push_back(nMax%nMin); MinCan.push_back(nMin-(nMax%nMin)); MaxCan = MinCan; MaxCan.push_back(nMax); if(c%a == 0 || c%b == 0 || c%(a+b) == 0) return true; if(c<nMax) { for (int i =0 ;i<MaxCan.size();++i) { for (int j =0 ;j<MinCan.size();++j) { if(MaxCan[i]-MinCan[j] == c) return true; } } } else { for (int i =0 ;i<MaxCan.size();++i) { for (int j =0 ;j<MinCan.size();++j) { if(MaxCan[i]+MinCan[j] == c) return true; } } } return false; } void main() { cout<<Can(3,5,4)<<"\n"; system("pause"); }
答案自己写的仅供参考