Задача
Найти НОД (наибольший общий делитель ) $n$ чисел.
Входные данные
Первая строка содержит количество чисел [latex]n \left(1 < n < 101\right)[/latex]. Во второй строке через пробел заданы [latex]n[/latex] натуральных чисел, каждое из которых не превышает [latex]30000[/latex].
Выходные данные
НОД заданных чисел.
Тесты
# | Входные данные | Выходные данные |
---|---|---|
1 | 3 5 7 2 |
1 |
2 | 2 45 10 |
5 |
3 | 4 27 90 15 9 |
3 |
4 | 2 40 64 |
8 |
5 | 3 8 8 8 |
8 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> using namespace std; int gcd (int a, int b) { while (a!=0 && b!=0) { if (a>b) { a=a%b; } else b=b%a; } return a+b; } int main () { int t, a, b; cin>>t>>b; for (int i=2; i<=t; ++i) { cin>>a; b=gcd (a, b); } cout<<b; return 0; } |
Решение задачи
Для решения данной задачи воспользуемся алгоритмом Евклида — алгоритмом нахождения наибольшего общего делителя (НОД) пары целых чисел, т.е. самого большого числа, на которое можно без остатка разделить оба числа, для которых ищется НОД.
Когда человек пересказывает словами код, но не говорит об алгоритмах, которые реализованы, это производит плохое впечатление. Чаще всего преподаватель с этим сталкивается, когда студент-двоечник принес чужой код и ничего в нем не понимает. Это ведь не Ваш случай, правда?
Зачтено.
Но почти 5 (пять!) месяцев между моим замечанием и Вашей реакцией на него это много.
Ну и для полноты стоит отметить, что есть рекурсивная реализация алгоритма Эвклида, которая выглядит лаконичнее, хотя не лишена недостатков всех рекурсивных функций