Легкими путями не хожу. Придумал свой алгоритм и хочется его реализовать. Для каждой введенной переменной создается два цикла с вложенными циклами. Суть его в следующем: каждая из двух переменных последовательно начинает делиться на число, начиная с двух. Это число итерируется внешним циклом. Внутренний цикл это делает до тех пор, пока деление на внешний итератор не оставляет остатка. Параллельно в предварительно созданные списки записывается число, равное внешнему итератору, до тех пор, пока выполняется внутренний цикл. Если деление оставляет остаток, выходим из внутреннего цикла, внешний итератор увеличивается на 1, проверяем условие (если выполнен внутренний цикл, то true), изменяем переменную до значения, которого достигли внутренним циклом. Запускаем повторно внутренний цикл с измененным внешним итератором и так далее.
Далее сравниваем два списка. Если имеются совпадения по значениям, заносим это значение в третий список. Чтобы эти значения при переборке заново не попадались, удаляем их из двух списков. Таким образом в третьем списке появится группа цифр, которые потом перемножим между собой и получим НОД. По моему замыслу эта группа цифр - не что иное, как делители, на которые делятся оба числа.
Загвоздка в том, что код не работает, потому что внешний цикл не видит результаты внутреннего. Значения переменных он берет не те, что поделил внутренний цикл, а те, что были введены с клавиатуры и далее все заново. И логический оператор также становится false, то есть берется значение снаружи. а значит блок между первым и вторым циклом никогда не выполнится. Как быть? Как сделать значения переменных внутреннего цикла "открытыми" для внешнего?
package com.javarush.task.task14.task1420;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
НОД
*/
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int a, b;
try {
if((a=Integer.parseInt(br.readLine()))<0||(b=Integer.parseInt(br.readLine()))<0)
throw new Exception1();
if(a==1||b==1)
System.out.println(1);
System.out.println(nod(a, b));
}
catch (Exception e){
System.out.println(e);
}
}
public static int nod (int a, int b) {
ArrayList<Integer> aList = new ArrayList<>();
ArrayList<Integer> bList = new ArrayList<>();
ArrayList<Integer> nodList = new ArrayList<>();
int countA=0, countB = 0;
boolean isA = false, isB = false;
for (int i = 2; i < a; i++) {
if (isA)
a = a / (i * countA);
isA = false;
while (a != 1) {
if (a % i == 0) {
isA = true;
aList.add(i);
System.out.println(aList);
a /= i;
countA++;
} else
break;
}
}
System.out.println("+++++");
for (int i = 2; i < b; i++) {
if (isB)
b = b / (i * countB);
isB = false;
while (b != 1) {
if (b % i == 0) {
isB = true;
bList.add(i);
System.out.println(bList);
b /= i;
countB++;
} else
break;
}
}
for (int i=0; i<aList.size(); i++){
for (int j=0; j<bList.size(); j++) {
if (aList.get(i) == bList.get(j)) {
nodList.add(aList.get(i));
aList.remove(aList.get(i));
bList.remove(bList.get(j));
}
}
}
int nod = 1;
for (Integer xNod : nodList) {
nod = nod * xNod;
}
return nod;
}
static class Exception1 extends Exception {
}
}
Может быть.Судя по всему нет. Оптимальное решение описал Евклид еще в III веке до нашей эры. Зачем изобретать велосипед на костылях?