java 2进制加减法 代码正确但oj超时,如何解决?

算出来是正确的,请大家看看,哪些代码会使运行超时呢?不胜感激!

public class BigBinary {
private int[] bits;
private boolean positive;

public BigBinary(int[] bits, boolean positive) {

this.bits=new int[bits.length];
for(int i=0;i<bits.length;i++){
this.bits[i]=bits[i];
this.positive = positive;

    }

}


public String toString() {
    String x = "";
    for (int i = 0; i < bits.length; i++) {
        x = x + bits[i];
    }
    if (x.contains("1")) {
        int t = x.indexOf("1");
        x = x.substring(t, x.length());
        if (positive == false) {
            x = "-" + x;
        }
    } else {
        x = "0";
    }
        return x;
}
public String to() {
    String x = "";
    for (int i = 0; i < bits.length; i++) {
        x = x + bits[i];
    }
    if (x.contains("1")) {
        int t = x.indexOf("1");
        x = x.substring(t, x.length());

    } else {
        x = "0";
    }
    return x;
}



public BigBinary add(BigBinary bigbinary) {
    if(bits.length==0) {
        this.bits=bigbinary.bits;
        this.positive= bigbinary.positive;
        return  bigbinary;
    }
    if(bigbinary.bits.length==0)
    {
        return this;
    }
    int[] c;
    int[] bu;


    if (this.positive && bigbinary.positive) {


        if (this.bits.length > bigbinary.bits.length) {
            c = new int[this.bits.length+1];
            bu = new int[this.bits.length];
            for (int i = this.bits.length - bigbinary.bits.length; i < this.bits.length; i++) {

                bu[i] = bigbinary.bits[i-bits.length+bigbinary.bits.length];

            }
            for (int i = c.length - 1; i >= 1; i--) {
                c[i] = c[i]+bits[i-1] + bu[i-1];
                if (c[i] == 2) {
                    c[i] = 0;
                    c[i - 1]++;
                }
                if (c[i] == 3) {
                    c[i] = 1;
                    c[i - 1]++;
                }
            }

        } else {

            c = new int[bigbinary.bits.length+1];
            bu = new int[bigbinary.bits.length];
            for (int i =bigbinary.bits.length - bits.length; i < bigbinary.bits.length; i++) {
                bu[i] =  bits[i-bigbinary.bits.length+ bits.length];
            }

            for (int i = c.length - 1; i >= 1; i--) {
                c[i] =c[i]+ bigbinary.bits[i - 1] + bu[i-1];
                if (c[i] == 2) {
                    c[i] = 0;
                    c[i - 1]++;
                }
                if (c[i] == 3) {
                    c[i] = 1;
                    c[i - 1]++;
                }
            }
        }

        BigBinary result = new BigBinary(c, true);
        this.bits = c;
        return result;

    }
    if (this.positive == false && bigbinary.positive == false) {
        if (this.bits.length > bigbinary.bits.length) {
            c = new int[this.bits.length+1];
            bu = new int[this.bits.length];
            for (int i = this.bits.length - bigbinary.bits.length; i < this.bits.length; i++) {

                bu[i] = bigbinary.bits[i-bits.length+bigbinary.bits.length];

            }
            for (int i = c.length - 1; i >= 1; i--) {
                c[i] = c[i]+bits[i-1] + bu[i-1];
                if (c[i] == 2) {
                    c[i] = 0;
                    c[i - 1]++;
                }
                if (c[i] == 3) {
                    c[i] = 1;
                    c[i - 1]++;
                }
            }

        } else {

            c = new int[bigbinary.bits.length+1];
            bu = new int[bigbinary.bits.length];
            for (int i =bigbinary.bits.length - bits.length; i < bigbinary.bits.length; i++) {
                bu[i] =  bits[i-bigbinary.bits.length+ bits.length];
            }

            for (int i = c.length - 1; i >= 1; i--) {
                c[i] =c[i]+ bigbinary.bits[i - 1] + bu[i-1];
                if (c[i] == 2) {
                    c[i] = 0;
                    c[i - 1]++;
                }
                if (c[i] == 3) {
                    c[i] = 1;
                    c[i - 1]++;
                }

            }
        }
        BigBinary result = new BigBinary(c, false);
        this.bits = c;
        return result;

    }
    if (positive == true && bigbinary.positive == false) {
        BigBinary b=new BigBinary(bigbinary.bits,true);

        return this.minus(b);

    }
    if (positive == false && bigbinary.positive == true) {
        BigBinary b=new BigBinary(bigbinary.bits,false);
        return this.minus(b);

    }
    return null;
}








public BigBinary minus(BigBinary bigbinary) {
    if(bits.length==0) {
        if (bigbinary.positive) {
            BigBinary r = new BigBinary(bigbinary.bits, false);
            this.bits=r.bits;
            this.positive=false;
            return r;
        }
        else {
            BigBinary r = new BigBinary(bigbinary.bits, true);
            this.bits=r.bits;
            this.positive=true;
            return r;
        }
    }
    if(bigbinary.bits.length==0)
    {
        return this;

    }

    int y = 2;
    int p=0;
    int q=0;
    for(int i=0;i< bits.length;i++)
    {
        if(bits[i]==1)
        {
            p=i;
            break;
        }
    }
    for(int i=0;i< bigbinary.bits.length;i++)
    {
        if(bigbinary.bits[i]==1)
        {
           q=i;
            break;
        }
    }
    if (bits.length-p == bigbinary.bits.length-q) {
        for (int i = p; i < bits.length; i++) {
            {
                if (bits[i] > bigbinary.bits[i - p + q]) {
                    y = 0;
                    break;
                }
                if (bits[i] < bigbinary.bits[i - p + q]) {
                    y = 1;
                    break;
                }

            }
        }
    }
    int[] c;
    int[] bu;
    if (positive && bigbinary.positive) {
        if (bits.length-p >  bigbinary.bits.length-q || y == 0) {

            c = new int[bits.length];
            bu = new int[bits.length];
            for (int i = bits.length-1; i>=bits.length-bigbinary.bits.length+q; i--) {

                bu[i] = bigbinary.bits[i- bits.length+bigbinary.bits.length];

            }
            for (int i =c.length-1; i >= 0; i--) {
                c[i] = bits[i] - bu[i];
                if (c[i] == -1&&i>=1) {
                    c[i]=1;
                    bits[i-1]--;
                }
                if(c[i]==-2&&i>=1)
                {
                    c[i]=0;
                    bits[i-1]--;
                }
            }
            BigBinary result = new BigBinary(c, true);
            this.bits = c;
            return result;
        } else {
            BigBinary b=new BigBinary(bigbinary.bits, bigbinary.positive);
            c = new int[bigbinary.bits.length];
            bu = new int[bigbinary.bits.length];
            for (int i = bigbinary.bits.length-1; i>=bigbinary.bits.length-bits.length+p; i--) {

                bu[i] = bits[i- bigbinary.bits.length+bits.length];

            }


            for (int i = c.length - 1; i >= 0; i--) {
                c[i] = b.bits[i] - bu[i];
                if (c[i] == -1&&i>=1) {
                    c[i]=1;
                    b.bits[i-1]--;
                }
                if(c[i]==-2&&i>=1)
                {
                    c[i]=0;
                    b.bits[i-1]--;
                }
            }

            BigBinary result = new BigBinary(c, false);
            this.bits = c;
            this.positive = false;
            return result;
        }
    }
    if (positive == false && bigbinary.positive == false) {
        if (bits.length-p >  bigbinary.bits.length-q || y == 0) {

            c = new int[bits.length];
            bu = new int[bits.length];
            for (int i = bits.length-1; i>=bits.length-bigbinary.bits.length+q; i--) {

                bu[i] = bigbinary.bits[i- bits.length+bigbinary.bits.length];

            }
            for (int i =c.length-1; i >= 0; i--) {
                c[i] = bits[i] - bu[i];
                if (c[i] == -1&&i>=1) {
                    c[i]=1;
                    bits[i-1]--;
                }
                if(c[i]==-2&&i>=1)
                {
                    c[i]=0;
                    bits[i-1]--;
                }
            }
            BigBinary result = new BigBinary(c, false);
            this.bits = c;
            return result;
        } else {
            BigBinary b=new BigBinary(bigbinary.bits, bigbinary.positive);
            c = new int[bigbinary.bits.length];
            bu = new int[bigbinary.bits.length];
            for (int i = bigbinary.bits.length-1; i>=bigbinary.bits.length-bits.length+p; i--) {

                bu[i] = bits[i- bigbinary.bits.length+bits.length];

            }


            for (int i = c.length - 1; i >= 0; i--) {
                c[i] = b.bits[i] - bu[i];
                if (c[i] == -1&&i>=1) {
                    c[i]=1;
                    b.bits[i-1]--;
                }
                if(c[i]==-2&&i>=1)
                {
                    c[i]=0;
                    b.bits[i-1]--;
                }
            }
                BigBinary result = new BigBinary(c, true);
                this.bits = c;
                this.positive = true;
                return result;

        }
    }
        if (positive == true && bigbinary.positive == false) {
            BigBinary b=new BigBinary(bigbinary.bits,true);
            return this.add(b);

        }
        if (positive == false && bigbinary.positive == true) {
            BigBinary b=new BigBinary(bigbinary.bits,false);
            return this.add(b);

        }
        return null;

}


public static BigBinary add(BigBinary b1, BigBinary b2) {
    BigBinary b=new BigBinary(b1.bits, b1.positive);
    BigBinary c=new BigBinary(b2.bits, b2.positive);
    return b.add(c);
}

public static BigBinary minus(BigBinary b1, BigBinary b2) {
    BigBinary b=new BigBinary(b1.bits, b1.positive);
    BigBinary c=new BigBinary(b2.bits, b2.positive);
    return b.minus(c);
}

}

检查一下for的位置,尤其是for套for,时间就是O(n*n)了,望采纳

OJ 那个题目呢,这个明眼看不出来,需要看你的题目,

校友好