Пользовательский ввод Java не заканчивается - PullRequest
0 голосов
/ 28 февраля 2019

Я работаю над Java-программой, чтобы найти значения s и t для GCD, и по какой-то причине моя программа не получит пользовательский ввод, если я не введу целые числа 2 и 3 в качестве ввода.Я не знаю, почему он это делает, и почему он принимает только эти два числа.Если бы кто-нибудь мог мне помочь, я был бы очень благодарен.

Вот мой код:

package test;
import java.util.Scanner;
public class test {
public static void main(String [] args) {

    int a;
    int b;
    int div;
    int dive;
    Scanner sc= new Scanner(System.in);
    System.out.println("Enter in values of A and B to find its GCD.");
    a = sc.nextInt();
    b = sc.nextInt();

    int[] Array1 = {1,0,a};
    int[] Array2 = {0,1,b};

    while (Array2[2] !=0) {
        if(Array1[2] > Array2[2])
        {
         div = Array1[2]/Array2[2];
        for (int i = 0; i<Array1.length;i++)
            for (int k = 0; k<Array2.length;k++)
                Array1[i] = Array1[i] - div* Array2[k];


        }
        else
        {
            dive = Array2[2]/Array1[2];
            for (int j = 0; j<Array1.length;j++)
                for (int l = 0; l<Array2.length;l++)
                    Array2[l] = Array2[l]- dive*Array1[j];
        }
      }
    if(Array2[2] == 0)
        System.out.println("S = " + Array1[0] + " t = " + Array1[1]);
    if(Array1[2] == 0)
        System.out.println("S = " + Array2[0] + " t = " + Array2[1]);


}
}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Ваш код работает в бесконечном цикле, потому что ваше условие while Array2[2] != 0 никогда не выполняется.

Это можно увидеть, напечатав значение Array2[2] в конце цикла for.

Вы должны использовать другой подход.

Подсказка: используйте евклидов алгоритм для вычисления GCD.

0 голосов
/ 28 февраля 2019

Проблема не в вашем сканере, проблема в цикле while и в циклах.Пусть a=2, b=4: (b - Array2 [2])

else
    {
        dive = Array2[2]/Array1[2];
        for (int j = 0; j<Array1.length;j++)
            for (int l = 0; l<Array2.length;l++)
                Array2[l] = Array2[l]- dive*Array1[j];
    }

dive=2

j=0 , l=2 --> b = b - 2*1 --> b=2

j=1 , l=2 --> b = b - 2*0 --> b=2

j=2 , l=2 --> b = b - 2*2 --> b=-2

Как видите, ваше значение не стремится к нулю, так что это делает цикл вечным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...