大数GCD

原题: 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));
    }
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/88343769
gcd