读书人

倒水有关问题

发布时间: 2014-01-01 18:12:08 作者: rapoo

倒水问题
庞果网上看到的
然后自己写了一个,可是有点问题,有的时候正常有的时候死循环求教啊
import java.util.*;
public class Lianxi1
{

public static void main(String[] arge)
{
int a,b,c;
a=(int)(Math.random()*1000000);
System.out.print("生成A为:"+a);

b=(int)(Math.random()*1000000);
System.out.print("生成B为:"+b);

c=(int)(Math.random()*1000000);
System.out.print("生成C为:"+c);
System.out.println("水缸是否刚好有C升水?");
System.out.println(a+b+c);//测试程序进行
boolean bl=Lianxi1.can(a,b,c); //判断是否能成功
System.out.println(bl);
}
public static boolean can(int a,int b,int c)
{

int sum=0;
int d=0;
int difference=0;
int c2=0;
if(a<b)
{
d=a;
a=b;
b=d;
}
difference=a-b;
if(b%difference!=0||c%difference==0){
while(sum!=c)
{

if(difference<c-sum)
{
sum+=difference;

}else{
int b2=0,a2=0;
while(difference!=c-sum)
{
c2=difference;
b2=b-c2;
a2=a-b2 ;
difference=a2-b;
}
sum+=difference;

}
}
return true;
}else{ return false;}
}
}


[解决办法]

引用:
while(difference!=c-sum)出问题
一旦不等 二者进到这个循环 数据就不变了,也就永远出不来了


你思路不对,用穷举法搜索整个状态空间,本来就行不通,数字稍大点程序就完蛋!

这题需要数论的知识,我简单提示一下,

用辗转想除法,先计算gcd(A,B),如果=1,说明互质,那么根据数论里的定理,
AB一定能配出一个1升来,C无论是多少,一定配得出来,直接返回true。

留个思考题给你,
如果AB不互质的,如何直接计算哪些C是可以配出的呢?(提示,和gcd有关)

读书人网 >J2SE开发

热点推荐