3

私は独学でJavaをやっていますが、このループの問題を理解できないようです:

問題は、2 つの整数 n1 と n2 の最大公約数を見つけることでした。ここで、d は小さい方の値です。メソッドは、GCD または 1 に達するまで d をデクリメントすることです。

    Scanner input = new Scanner(System.in);
    System.out.println("Please enter two integers: ");
    int n1 = input.nextInt();
    int n2 = input.nextInt();

    int d = 0;
    int temp = 0;
    //finds the lowest value
    if(n1 < n2) {
        temp = n1;
        n1 = n2;
        n2 = temp;
    }

    for(d = n1;(n1 % d !=0 && n2 % d != 0);d--)  {

    }

    System.out.println("The GCD of " + n1 + " and " + n2 + " is " + d);

ポインタはありますか?

4

5 に答える 5

6

ここのロジックは間違っています:

(n1 % d !=0 && n2 % d != 0)

への変更:

(n1 % d !=0 || n2 % d != 0)

または、コードは、GCD の代わりに n1またはn2の除数が見られると停止します。これは、ループ終了条件が実行したいことの否定でなければならないためです。

于 2013-05-07T16:13:27.447 に答える
1

反復

public static long gcd(long a, long b){
   long factor= Math.max(a, b);
   for(long loop= factor;loop > 1;loop--){
      if(a % loop == 0 && b % loop == 0){
         return loop;
      }
   }
   return 1;
}

反復ユークリッドのアルゴリズム

public static int gcd(int a, int b) //valid for positive integers.
{
    while(b > 0)
    {
        int c = a % b;
        a = b;
        b = c;
    }
    return a;
}

最適化された反復

static int gcd(int a,int b)
    {
        int min=a>b?b:a,max=a+b-min, div=min;
        for(int i=1;i<min;div=min/++i)
            if(max%div==0)
                return div;
        return 1;
    }

再帰的

public static long gcd(long a, long b){
   if(a == 0) return b;
   if(b == 0) return a;
   if(a > b) return gcd(b, a % b);
   return gcd(a, b % a);
}

ビルトイン

import java.math.BigInteger;

public static long gcd(long a, long b){
   return BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).longValue();
}

経由 - http://rosettacode.org/wiki/Greatest_common_divisor

于 2013-10-20T01:51:32.220 に答える
0

public static int gcd(int a,int b)

{
    if(a>b)
        if(a%b==0)
            return b;
        else
            return gcd(b,a%b);
    else
        if(b%a==0)
            return a;
        else
            return gcd(a,b%a);
}

これは、すべての数値をループしない最善の方法です。ロジックを開発するのに役立つので、自分で理解するようにしてください。理解できない場合は、返信してください。ロジックを説明します。

于 2013-05-07T16:38:47.480 に答える
0

問題は別の方法でも解決できます。以下のコードは私のものではありませんが、ロジックはよく理解しています。あなたのロジックは優れており、回答で示唆されているように、それも完璧になりました。あなたへの私のアドバイスは、そのような計算のための関数を書いてみることです。そうすれば、面倒な作業を非常に簡単な方法で行うことができます。以下のコードは、書き込み関数の有用性の良い例です。

 public static int gcd(int a,int b){
     if(b==0){
       return a;
     }
      return gcd(b,a%b);        
 }
 public static void main(String args[]){
     Scanner input = new Scanner(System.in);
     System.out.println("Please enter two integers: ");
     int n1 = input.nextInt();
     int n2 = input.nextInt();
     System.out.println("The GCD of " + n1 + " and " + n2 + " is " + gcd(n1,n2));

 }

ではごきげんよう!

于 2013-08-04T18:16:32.140 に答える