Я не могу понять, какую математическую функцию решает этот код. Может кто-нибудь объяснить мне?
int m = 12;
int n = 81;
while (m != n)
{
if (m > n)
m -= n;
else
n -= m;
}
System.out.println("m = " + m);
/* 12 != 81: true, 12 > 81: false, n = 81 - 12 = 69
12 != 69: true, 12 > 69: false, n = 69 - 12 = 57
12 != 57: true, 12 > 57: false, n = 57 - 12 = 45
12 != 45: true, 12 > 45: false, n = 45 - 12 = 33
12 != 33: true, 12 > 33: false, n = 33 - 12 = 21
12 != 21: true, 12 > 21: false, n = 21 - 12 = 9
12 != 9: true,12 > 9: true, m = 12 - 9 = 3
3 != 9: true, 3 > 9: false, n = 9 - 3 = 6
3 != 6: true, 3 > 6: false, n = 6 - 3 = 3
3 != 3: false
m = 3 */
@ Дэвид, правильно.
Это более старый алгоритм, называемый алгоритмом Евклида , позволяющий найти наибольший общий делитель (НОД) двух чисел.
Алгоритм Евклида — более эффективный способ найти НОД двух чисел. Этот код работает, беря два целых числа, m
и n
, а затем многократно вычитая меньшее из двух чисел из большего, пока они не станут равными. Согласно правилу общее значение — это наибольший общий делитель исходных двух чисел.
В коде m
начинается с 12, а n
— с 81. Вы многократно вычитаете меньшее число из большего, пока они не станут равными. В конце m
становится 3, а n
становится 3. Поскольку m
теперь равно n
, цикл заканчивается (твоё while
условие цикла m!=n
). Значение m
или n
— это наибольший общий делитель исходных двух чисел, равный 3.
Возможно, вам просто захочется поискать алгоритм Евклида для лучшего понимания.
Не уверен, что я бы назвал то, чему 2300 лет, «старым алгоритмом», а не «самым старым алгоритмом». Особенно если вы не собираетесь специально называть более современные алгоритмы. Точно так же, если вы говорите, что это «более эффективно», пожалуйста, укажите названия алгоритмов, по сравнению с которыми он более эффективен. В противном случае это не «более» эффективно, а просто эффективно.
Просто предположение, а может быть, это для нахождения наибольшего общего делителя?