原题: https://www.luogu.org/problemnew/show/P2152
java大数有个gcd的函数,但是我想自己套一下stein,于是。。。
import java.math.*;
import java.util.*;
public class Main {
public static BigInteger _0=BigInteger.valueOf(0);
public static BigInteger _1=BigInteger.valueOf(1);
public static BigInteger _f1=BigInteger.valueOf(-1);
public static BigInteger Stein(BigInteger a,BigInteger b){
if(a.compareTo(_0)==0)return b;
if(b.compareTo(_0)==0)return a;
boolean _a=(a.or(_1).compareTo(_0)==0);
boolean _b=(b.or(_1).compareTo(_0)==0);
if(_a&&_b)return Stein(a.shiftRight(1),b.shiftRight(1)).shiftLeft(1);
else if(_a)return Stein(a.shiftRight(1),b);
else if(_b)return Stein(a,b.shiftRight(1));
return Stein(a.subtract(b).abs(),a.min(b));
}
public static void main(String args[]) {
Scanner cin=new Scanner(System.in);
BigInteger a=cin.nextBigInteger();
BigInteger b=cin.nextBigInteger();
System.out.println(Stein(a,b));
}
}
直接套stein,因为栈溢出RE了,就把递归改成了循环。
import java.math.*;
import java.util.*;
public class Main {
public static BigInteger _0=BigInteger.valueOf(0);
public static BigInteger _1=BigInteger.valueOf(1);
public static void main(String args[]) {
Scanner cin=new Scanner(System.in);
BigInteger a=cin.nextBigInteger();
BigInteger b=cin.nextBigInteger();
int ct=0;
while(1==1){
if(a.compareTo(_0)==0){System.out.println(b.shiftLeft(ct));break;}
if(b.compareTo(_0)==0){System.out.println(a.shiftLeft(ct));break;}
boolean _a=(a.or(_1).compareTo(_0)==0);
boolean _b=(b.or(_1).compareTo(_0)==0);
if(_a&&_b){
ct++;
a=a.shiftLeft(1);
b=b.shiftLeft(1);
}
else if(_a){
a=a.shiftLeft(1);
}
else if(_b){
b=b.shiftLeft(1);
}
else{
BigInteger tmp=a;
a=a.subtract(b).abs();
b=b.min(tmp);
}
}
}
}
然后就MLE了,我想可能是循环内定义变量的原因,把循环内的几个变量拉出去,就多过了一个案例。没办法,回归本源吧…
import java.math.*;
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner cin=new Scanner(System.in);
BigInteger a=cin.nextBigInteger();
BigInteger b=cin.nextBigInteger();
System.out.println(a.gcd(b));
}
}