1

Java でプログラムを作成しましたが、計算時間が非常に長くなりました。理由がわかりません。複雑さを軽減するための指針を教えてください。また、3,100 以降のようないくつかの値を計算した後、nullpointer 例外が発生します。コード:

public class Fraction
{
    long n;
    long d;

    public Fraction()
    {
        n= 0L;
        d= 1L;
    }

    public Fraction(long a,long b)
    {
        n= a;
        d= b;
    }

    public Fraction mult(Fraction a, Fraction b)
    {
        Fraction product = new Fraction();
        product.n = a.n * b.n;
        product.d = a.d * b.d;
        long hcf=gcd(product.n,product.d);
        product.n/=hcf;
        product.d/=hcf;
        return product;
    }

    public Fraction add(Fraction a, Fraction b)
    {
        Fraction sum = new Fraction();
        sum.d = a.d * b.d;
        sum.n = a.n * b.d + a.d * b.n;
        long hcf=gcd(sum.n,sum.d);
        sum.n/=hcf;
        sum.d/=hcf;
        return sum;
    }

    public Fraction divide(Fraction a, Fraction b)
    {
        Fraction quotient = new Fraction();
        quotient.n = a.n * b.d;
        quotient.d = a.d * b.n;
        long hcf=gcd(quotient.n,quotient.d);
        quotient.n/=hcf;
        quotient.d/=hcf;
        return quotient;
    }

    long gcd(long a,long b)
    {
        long hcf=0,min;
        min=(a<b)?a:b;
        for(long i=1;i<=min;i++)
        {
        if(a%i==0 &&b%i==0)
        hcf=i;
        }
        return hcf;
    }
}

class foo extends Fraction
{
    static void main()
    {
        Fraction obj=new Fraction();
        Fraction f[][]=new Fraction[103][103];
        for(int i=1;i<=100;i++)
        {
            f[1][i]=new Fraction(1L,(long)i);
            f[i][1]=f[1][i];
            f[2][i]=obj.add(new Fraction(1L,(2L*i)),new Fraction((i*i-1L),3L)); 
            f[i][2]=f[2][i];
        }
        for(int i=3;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                f[i][j+1]=obj.divide(obj.add(new Fraction(1,1),obj.mult(f[i-1][j+1],f[i][j])), f[i-1][j]);
                System.out.println(i+","+j+"="+f[i][j].n+"/"+f[i][j].d);
            }
        }
    }
}
4

2 に答える 2

0

注意:j + 1に移動し、for句で100まで移動するため、範囲外のインデックスの例外を取得できます。

于 2013-01-11T13:30:56.573 に答える
0

NPE はj+1f[1][i]=new Fraction(...); に由来し、由来する可能性があります。ここで、0 といくつかをスキップします。遅さは確かに gcd にも起因します。@wxyz を参照してください。 Fraction objと呼ぶことができますfinal Fraction ZERO

インデックス付け規則は : の代わりに使用してい<ます。<=for ...; i < f.length; ...

どちらかが変わる

public Fraction divide(Fraction a, Fraction b)

の中へ

public static Fraction divide(Fraction a, Fraction b)

呼び出しは Fraction.divide(a, b) になります。

またはそれ以上

public Fraction divide(Fraction b)

wherethisは a の役割を果たします。

于 2013-01-11T13:35:06.207 に答える