倒水问题 while(sum!=c)有问题,还有题目也没有,不知道你在判断啥 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有两个容器,容积分别为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);} while(difference!=c-sum)出问题一旦不等 二者进到这个循环 数据就不变了,也就永远出不来了 你思路不对,用穷举法搜索整个状态空间,本来就行不通,数字稍大点程序就完蛋!这题需要数论的知识,我简单提示一下,用辗转想除法,先计算gcd(A,B),如果=1,说明互质,那么根据数论里的定理,AB一定能配出一个1升来,C无论是多少,一定配得出来,直接返回true。留个思考题给你,如果AB不互质的,如何直接计算哪些C是可以配出的呢?(提示,和gcd有关) 地球人都知道gcd(A,B)求最大公约数 ,为1 为质数。 那么 A=5,B=7 ,你给我配个C=1 出来试试呗 最大公约数的倍数 gcd(a,b)*n, n=1,2. 至最大值 地球人都知道gcd(A,B)求最大公约数 ,为1 为质数。 那么 A=5,B=7 ,你给我配个C=1 出来试试呗A=5,B=7(0,7)(5,2)(0,2)(2,0)(2,7)(5,4)(0,4)(4,0)(4,7)(5,6)(0,6)(5,1)B=1骚年啊,不要挑战数学定理啊。思考题想出来了码? 地球人都知道gcd(A,B)求最大公约数 ,为1 为质数。 那么 A=5,B=7 ,你给我配个C=1 出来试试呗A=5,B=7(0,7)(5,2)(0,2)(2,0)(2,7)(5,4)(0,4)(4,0)(4,7)(5,6)(0,6)(5,1)B=1骚年啊,不要挑战数学定理啊。思考题想出来了码?厉害,我刚放上去就感觉不对了 不是吧,哪个说解这道题还要用离散数学、基础数论,高等代数、群环域、等价类……?用不着吧题目要求:容量为a的杯子和容量为b的杯子称量出容量c的水(假设a<b)等价于求解二元一次方程a*x+b*y=c首先,将c对a*b取模,将c的大小限制在a*b之内然后将方程化为a*x=c-b*y从y=-a循环到y=a(因为c<a*b),若能找到a的倍数,即有解,否则无解。=======举例:a=5,b=7,c=1则5*x=1-7*y从y=-5遍历到y=5,发现5*3=1-7*(-2)和5*(-4)=1-7*3两个解答:1=15-14=21-20=======呵呵,这是一个纯数学题啊,跟这个http://bbs.csdn.net/posts/395218489一样,靠数学解决的 朋友,所谓取模,不就是划分等价类吗?而这些等价类,加上运算符不就是群或域吗?至于a*x+b*y=c 线性方程的整数解,不是基础数论的研究题目之一吗?多学点数学,以后碰到这类问题才能高屋建瓴。 我…这刹那我震惊了。原来这么简单的思路也可以有这么专业的名词,哎~自叹不如啊,我真心不懂那些词汇。跟我当年听到XSS攻击时一样震惊,我当年发现某网站XSS漏洞的时候压根就不知道这个词汇……汗颜 下面是我的代码,不知道为何通不过,想不通,高人请指点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;} 失误~\(≧▽≦)/~啦啦啦,没看清题还真是可以,A倒到B中3次,首次倒满时,B倒空就行了,二次倒满后,A中剩余的是1L 介绍JAVA类库的最好的书是哪一本? 一条正则表达式,为什么报错,请高手指点下。 关于开发工具的请教 关于从文件取数据的问题? 关于JAVA网络编程 一些JAVA相关的经典电子书(PDF),免费下载 想知道局域网内有哪些用户共享了文件,用java该怎么实现呢 在子树中怎样插入图片? 请问一个关于进程的问题。谢谢。 关于面试的问题. 请问这个排序的小程序错在什么地方 spark+openfire
我们还有一个足够大的水缸,足够容纳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);
}
一旦不等 二者进到这个循环 数据就不变了,也就永远出不来了
你思路不对,用穷举法搜索整个状态空间,本来就行不通,数字稍大点程序就完蛋!这题需要数论的知识,我简单提示一下,用辗转想除法,先计算gcd(A,B),如果=1,说明互质,那么根据数论里的定理,
AB一定能配出一个1升来,C无论是多少,一定配得出来,直接返回true。留个思考题给你,
如果AB不互质的,如何直接计算哪些C是可以配出的呢?(提示,和gcd有关)
地球人都知道gcd(A,B)求最大公约数 ,为1 为质数。
那么 A=5,B=7 ,你给我配个C=1 出来试试呗
地球人都知道gcd(A,B)求最大公约数 ,为1 为质数。
那么 A=5,B=7 ,你给我配个C=1 出来试试呗A=5,B=7
(0,7)
(5,2)
(0,2)
(2,0)
(2,7)
(5,4)
(0,4)
(4,0)
(4,7)
(5,6)
(0,6)
(5,1)
B=1骚年啊,不要挑战数学定理啊。思考题想出来了码?
地球人都知道gcd(A,B)求最大公约数 ,为1 为质数。
那么 A=5,B=7 ,你给我配个C=1 出来试试呗A=5,B=7
(0,7)
(5,2)
(0,2)
(2,0)
(2,7)
(5,4)
(0,4)
(4,0)
(4,7)
(5,6)
(0,6)
(5,1)
B=1骚年啊,不要挑战数学定理啊。思考题想出来了码?
厉害,我刚放上去就感觉不对了
等价于求解二元一次方程a*x+b*y=c
首先,将c对a*b取模,将c的大小限制在a*b之内
然后将方程化为a*x=c-b*y
从y=-a循环到y=a(因为c<a*b),若能找到a的倍数,即有解,否则无解。
=======
举例:a=5,b=7,c=1
则5*x=1-7*y
从y=-5遍历到y=5,发现5*3=1-7*(-2)和5*(-4)=1-7*3两个解
答:1=15-14=21-20
=======
呵呵,这是一个纯数学题啊,跟这个http://bbs.csdn.net/posts/395218489一样,靠数学解决的
朋友,所谓取模,不就是划分等价类吗?
而这些等价类,加上运算符不就是群或域吗?
至于a*x+b*y=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;
}
还真是可以,A倒到B中3次,首次倒满时,B倒空就行了,二次倒满后,A中剩余的是1L