0

このコードは正常にコンパイルされますが、実行すると、期待どおりに 2 つの番号を要求され、そこに座って何もしません。私はインターネットを検索し、一日中これに取り組んできました。私はついに洞窟に入り、助けを求めています。

自動的にループバックしないという問題ですか? これで10時間後、何も見つかりませんでした。

import java.util.Scanner;

public class EA
{
    public static void main (String[] args)
    {
        // get first integer from user
        Scanner input = new Scanner(System.in);
        System.out.println("Please enter the larger integer: ");
        int I;
        I = input.nextInt();

        // get second integer from user
        System.out.println("Please enter the smaller integer: ");
        int J;
        J = input.nextInt();

        //resolve the issue of zero
        while(J<1)
        {
            System.out.println("Can not divide by zero!");
            System.out.println("Please enter new smaller integer: ");
            J = input.nextInt();

            //do the calculations
            while(J>0)
            {
                int Remainder;
                Remainder = I % J;

                while(Remainder>0)
                {
                    I = J;
                    J = Remainder;

                    return;

                }
                System.out.println("GCD is" + J);
            }
        }
    }
}
4

5 に答える 5

2

すでに述べたものの中で、あなたは混乱whileしていifます。while最初の入力が悪い場合にのみ実行されるループ内にアルゴリズム ロジックを配置しました。

// get first integer from user
Scanner input = new Scanner(System.in);
System.out.println("Please enter the larger integer: ");
int I;
I = input.nextInt();

// get second integer from user
System.out.println("Please enter the smaller integer: ");
int J;
J = input.nextInt();

//resolve the issue of zero
while(J<1)
{
    // You never reach here under ordinary conditions
}
于 2013-09-22T22:11:56.387 に答える
2

SJuan は、リターンがループを壊すと述べていますが、これは本当ですが、修正されたとしても、他にもいくつかの問題があります。

  • 内部 while never end (無限ループ)
  • 結果は格納されますJ- ではありませんI
  • System.out.println("GCD is " + I);アウターの外側にプリントするべし!

プログラムの「心臓」はこれを行う必要があります。

    // we get here with valid values stored in I,J
    int Remainder  = I % J;
    //do the calculations
    while(Remainder>0)
    {
        I = J;
        J = Remainder;
        Remainder  = I % J;
    }
    System.out.println("GCD is " + J);
于 2013-09-22T22:07:29.937 に答える
0

複数のエラーがあります: while の戻り値、アルゴリズム、および最初の while の括弧です。

1) ゼロの問題を解決する場合、変数 J の値を再割り当てした後、while の括弧を突然閉じる必要があります。

while (J < 1) {
    System.out.println("Can not divide by zero!");
    System.out.println("Please enter new smaller integer: ");
    J = input.nextInt();
}

2) gcd を計算するアルゴリズムは次のとおりです。

function gcd(a, b)
    while b ≠ 0
       t := b
       b := a mod t
       a := t
    return a

コードの正しいバージョンは次のとおりです。

public static void main(final String[] args) {
    // get first integer from user
    final Scanner input = new Scanner(System.in);
    System.out.println("Please enter the larger integer: ");
    int I;
    I = input.nextInt();

    // get second integer from user
    System.out.println("Please enter the smaller integer: ");
    int J;
    J = input.nextInt();

    // resolve the issue of zero
    while (J < 1) {
        System.out.println("Can not divide by zero!");
        System.out.println("Please enter new smaller integer: ");
        J = input.nextInt();
    }
    // do the calculations
    while (J != 0) {
        int Remainder;
        Remainder = I % J;
        I = J;
        J = Remainder;
    }
    System.out.println("GCD is" + I);

}
于 2013-09-22T22:11:39.457 に答える
0

ループのreturn途中で実行が終了します。

これです

 while(Remainder>0)
 {
     I = J;
     J = Remainder;

    return; <------- THIS IS THE RETURN THAT BREAKS ALL

 }

に到達しませんSystem.out.println

更新: また、input.nextInt()に対して 2 回行いJます。おそらくあなたの説明から、3番目の整数を入力するのを待ち続けています。

于 2013-09-22T22:05:50.227 に答える
0

ユークリッドのアルゴリズムには、最大公約数を計算するために両方の入力が非ゼロでなければならないという欠点があります。しかし、入力の 1 つがゼロ ('0') のときに GCD を調べたい場合は、ロジックを少し微調整します。入力の 1 つがゼロの場合、GCD は 1 であり、GCD を計算するには 'a' が 'b' より大きくなければなりません。以下のスニペットを確認してください。

    if (a < b) {
        int temp = a;
        a = b;
        b = temp;
    }
    if (b == 0) {
        System.out.println("1");
    } else {
        while (b != 0) {
            r = a % b;
            a = b;
            b = r;
        }
于 2014-05-21T20:21:48.267 に答える