倒水问题,个人调试了,感觉应该没问题,提交却没有通过,高手们看下代码,给指点一二,感激不尽:
有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。
我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。
可以进行的操作是:
把一个容器灌满;
把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);
用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。
问是否能够通过有限次操作,使得水缸最后恰好有C升水。
输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000
输出:0或1,表示能否达到要求。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
bool can(int a,int b,int c) {
bool br = false;
cout<<a<<" "<<b<<" "<<c<<endl;
if(a==b){
if(c%a==0) {cout<<c<<"="<<c/a<<"*"<<a; return true;}
else return false;
}
if(b<a){int t=b; b=a;a=t;}
int k=b/a;
if(b%a>0)k++;
else k--;
int akm2,akm1;
if(b%a>0){
akm2=b-a*(k-1);
akm1=b-a*k;
}
else{
if(c%a>0) return false;
else {cout<<c<<"="<<c/a<<"*"<<a<<endl; return true;}
}
int n1 = c/akm1;
int n2 = c/akm2;
for(int i=n1;i<=n2;i++){
if((c-i*b)%a==0){
cout<<c<<"="<<(c-i*b)/a<<"*"<<a<<"+"<<i<<"*"<<b<<endl;
return true;
}
}
return br;
}
int main()
{
bool br = can(50,47,256);
br = can(99999, 1, 1);
//1 2 1000000000 1000000000=1000000000*1 1000000000 2 1
//123456789 987654321 33333 37 74 111 111=3*37 99999 1 1 1=1*1 1234567 7654321 9999999
br = can(1, 2, 1000000000);
//if(br) cout<<"keyi"<<endl;
//else cout<<"cant"<<endl;
}