编程挑战之倒水——问题在哪儿呢

倒水问题,个人调试了,感觉应该没问题,提交却没有通过,高手们看下代码,给指点一二,感激不尽:


题目详情:
有两个容器,容积分别为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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值