Программа работает, решает правильно (сверял ответы с результатами в онлайн-калькуляторах на других сайтах). Почему не принимает - не понятно. Ответ вывожу, как и просит. Советую смотреть эту версию кода, т.к. он с комментами:
public static void main(String[] args) throws Exception {
BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
// Считываем
int num1 = Integer.parseInt(rd.readLine());
int num2 = Integer.parseInt(rd.readLine());
// Если 0 или меньше - выкинуть исключение
if (num1 <= 0 || num2 <= 0) {
throw new Exception();
}
/**
* Какая логика метода fillIt - он принимает число и
* возвращает HashSet с простыми множителями. Пример число 12
* 12 / 2 = 6
* 6 / 2 = 3
* 3 / 3 = 1
* Он вернет сет с числами 2 и 3
* Если число простое (может делится только на себя), как
* к примеру 2147483647 - он добавит в сет 1 и вернет его
*
* На выходе получаем - сет с
*/
Set<Integer> flist = fillIt(num1);
Set<Integer> slist = fillIt(num2);
/**
* Суть giveMeAnswer = принимает 2 сета, и проверяет 2мя циклами
* каждое число. Если они совпадают - множит их
*/
int result = giveMeAnswer(flist, slist);
System.out.println(result);
}
static Set<Integer> fillIt(int numb) {
Set<Integer> set = new HashSet<>();
int copy = numb;
// цикл до тех пор, пока число не будет равен 1
while (!(numb == 1)) {
/*
цикл перебора простых чисел, что бы поделить
без остатка. Пока i меньше (корня из ЧИСЛА + 10)
(это для простых чисел, если к примеру будет
число 2147483647 - то он попросут зависнет. В
чем суть - если ЧИСЛО не делится без остатка
на 2, 3, 4... до числа своего корня - оно простое. )
*/
for (int i = 2; i < Math.sqrt(copy) + 10; i++) {
// если число без остатка делится на i
if (numb % i == 0) {
numb /= i; // число = число / i
set.add(i); // добавить i
break; // завершить этот цикл.. если numb = 1 - выйдет, если нет - снова пойдет по этому циклу
} else if (i > Math.sqrt(copy)) {
// вот оно.. если оно не поделилось до своего кореня
// - оно простое. Если поделилось - сюда не дойдет.
set.add(1);
return set;
}
}
}
return set;
}
static int giveMeAnswer(Set<Integer> first, Set<Integer> second) {
int result = 1;
// Перебираем первый сет по второму, тут вроде все просто
for (Integer n1 : first) {
for (Integer n2 : second) {
if (n1.equals(n2)) {
result = result * n1;
}
}
}
return result;
}
package com.javarush.task.task14.task1420;
/*
НОД
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
int num1 = Integer.parseInt(rd.readLine());
int num2 = Integer.parseInt(rd.readLine());
if (num1 < 0 || num2 < 0 || num1 == 0 || num2 == 0) {
throw new Exception();
}
Set<Integer> flist = fillIt(num1);
Set<Integer> slist = fillIt(num2);
int result = giveMeAnswer(flist, slist);
System.out.println(result);
}
static Set<Integer> fillIt(int numb) {
Set<Integer> list = new HashSet<>();
int copy = numb;
while (!(numb == 1)) {
for (int i = 2; i < Math.sqrt(copy) + 10; i++) {
if (numb % i == 0) {
numb /= i;
list.add(i);
break;
} else if (i > Math.sqrt(copy)) {
list.add(1);
numb = 1;
break;
}
}
}
return list;
}
static int giveMeAnswer(Set<Integer> first, Set<Integer> second) {
int result = 1;
for (Integer n1 : first) {
for (Integer n2 : second) {
if (n1.equals(n2)) {
result = result * n1;
}
}
}
return result;
}
}