0

加算、減算などに関連するいくつかのメソッドを持つRationalクラスを作成しようとしています。コンストラクター内で値をプライベート変数に追加し、GCDを見つけて分数を単純化するようにしたいと考えています。私が遭遇する問題は、if ステートメントにあります。object パラメーター内の数値が負かどうかを確認したいので、if ステートメントを使用して確認します。唯一の問題は、プログラムを実行したときに負の値が返されないことです。つまり、Rational p = new Rational(-24, 48) があり、1/2 しか返されません。

public class TestRational {

    public static void main(String... args) {
        Rational p = new Rational(-24, 48);
    }

    public Rational(long a, long b){
        numerator = a;
        denominator = b;
        boolean isNegative = false;
        if (numerator*denominator < 0)
            isNegative = true;
        long gd = gcd(numerator, denominator);
        numerator /= gd;
        denominator /= gd;
        if (isNegative)
            numerator = -numerator;;
    }

    private long gcd(long p, long q){
        //checks to see if numerator greater than denominator
        if(p<q)
            return gcd(q,p);
        if(Math.abs(q) == 0)
            return p;
        long remainder = Math.abs(p)%Math.abs(q);
        return gcd(Math.abs(q), Math.abs(remainder));
    }
}
4

3 に答える 3

5

あなたはこれを必要としません

if (isNegative)
 numerator = -numerator;;

したがって、コンストラクターは次のようになります

public Rational(long a, long b){
 numerator = a;
 denominator = b;
 boolean isNegative = false;
 if (numerator*denominator < 0)
 isNegative = true;
 long gd = gcd(numerator, denominator);
 numerator /= gd;
 denominator /= gd;
}

それがうまくいくことを願っています...

于 2012-09-18T20:42:54.693 に答える
1

あなたの質問がGCDとの範囲を明示的に使用するようにあなたに求めない限り、そしてあなたabそれをループで簡単に実装することができます:

public Rational(long a, long b){
    boolean isNegative = a < 0 || b < 0;
    a = Math.abs(a);
    b = Math.abs(b);
    for (int i = min(a, b); i >= 2; --i)
        if (a % i == 0 && b % i == 0)
        {
            a /= i;
            b /= i;
        }
    numerator = isNegative ? -a : a;
    denominator = b;
}
于 2012-09-18T20:50:02.893 に答える
0

あなたのコードにいくつかの「回避可能な間違い」を指摘したいと思います。

  1. コンストラクターの名前は、クラスの名前と同じでなければなりません。あなたの場合、そうではありません
  2. 単一のステートメントが含まれている場合でも、if{ ステートメント}にはブロックを使用します。
  3. ローカル変数の分子と分母の型を宣言してませ
  4. あなたが話しているプラ​​イベート変数は何ですか?

投稿中はコードにもう少し注意を払ってください。質問に対する適切な回答を得るのに役立ちます

于 2012-09-18T21:16:35.977 に答える