该代码的哪一部分使我的程序变慢

时间:2018-10-28 04:46:09

标签: java biginteger

我正在使用以下代码回答比赛问题:

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
import java.math.BigInteger;
//ans is modulu 998244353

public class ShiftAndAdd {
    private static long mod = 998244353;
    private static Scanner input = new Scanner(System.in);
    public static void main(String[] args)throws IOException {
        BigInteger ans=new BigInteger("0");
        int n,m;
        BigInteger numb_a,numb_b;

        n= input.nextInt();
        m=input.nextInt();
        numb_a=input.nextBigInteger();
        numb_b=input.nextBigInteger();
        long[] a = new long[n];
        long[] b = new long[m];
        long[] a1 = new long[n];//will contain indices of cells of "a" containing 1's
        long[] b1 = new long[m];
        int ka1=0;//will be actual length of a1
        int kb1=0;//will be actual length of b1



        for(int i=0;i<n;i++) {
            a[n-1-i]=numb_a.longValue()%10;
            numb_a=numb_a.divide(new BigInteger("10"));
        }
        for(int i=0;i<m;i++) {
            b[m-1-i]=numb_b.longValue()%10;
            numb_b=numb_b.divide(new BigInteger("10"));
        }
        int a1start=(m>=n)?m-n:0;
        ka1=a1start;
        for(int i=0;i<n;i++)
            if(a[i]==1)
                a1[ka1++]=i;
        int counter=0;
        for(int i=0;i<m;i++)
            if(b[i]==1)
                b1[kb1++]+=++counter;
            else b1[kb1++]=counter;


        //answer:
        for(int i=a1start;i<ka1;i++) {
            ans=ans.add(BigInteger.valueOf((fastExp((long)2,(n-1-a1[i]))%mod *b1[(int)(a1[i]+a1start)] %mod)%mod));
        }
        print(ans.longValue());
    }//end main


    private static long fastExp(long a,long b) {
        if(b>0) {
            if(b%2==0)
                return fastExp((a%mod*a%mod)%mod,b/2);
            else return (a%mod*fastExp(a,b-1)%mod)%mod;
        }
        return 1;
    }//end method fastExp

    private static  void print(long t) {
        System.out.println(t);
    }//end method print

}//end class ShiftAndAdd

但是,在线编译器给我一些输入超出了时间限制(向变量numb_a和numb_b输入非常大的整数) 我的问题是我不知道超过时间限制,是在我读整数时是因为BigInteger类的方法很慢?还是因为方法valueOf和此类的添加很慢? 我需要知道尝试修复它的原因

1 个答案:

答案 0 :(得分:1)

如果您不必使用java.math.BigInteger,则最好改用long类型的原语,使用不可变对象有利于可伸缩性,但是由于您运行的线程数不多,因此使用它不会带来任何好处,但这会带来GC的缺点,如果您使用Objects的次数多于使用基元的次数,GC的工作频率会更高。