И вот я, следуя советам многих, час назад начал читать монографию Д. Кнута "Исскуство программирования". Автор приводит алгоритм Евклида : Алгоритм Е E1. [Нахождение остатка.] Разделим m на n, пусть остаток от деления будет равен r (где 0<=r<n) E2. [Сравнение с нулем.] Если r=0, то выполнение алгоритма прекращается; n- искомое значение. E3. [Замещение.] присвоить m:=n, n:=r и вернуться к шагу E1. Я решил, что следует быстренько реализовать на C++: Код (Text): #include <stdio.h> #include <conio.h> int main() { int m,n,r; printf("введи m,n: "); scanf("%d%d",&m,&n); r=m%n; while(r!=0){ m=n; n=r; r=m%n; } printf("наибольший общий делитель= %d",r); getch(); return 0; } В конце раздела, в 3 упражнении: Измените алгоритм E (из соображений эффективности) таким образом, чтобы исключить из него все тривиальные операции замены типа "m:=n". Запишите этот новый алгоритм в стиле алгоритма E и назовите его алгоритомом F. На C++ у меня получилось так: Код (Text): #include <stdio.h> #include <conio.h> int main() { int m,n,r; printf("введи m,n: "); scanf("%d%d",&m,&n); r=m%n; while(r!=0){ if(!(n%r)) break; r=n%r; } printf("наибольший общий делитель= %d",r); getch(); return 0; } Вот только если после первого нахождения остатка он будет равен нулю, программа выведет 0. Почуствовал себя имбицилом, когда не смог решить вроде такое простое упражнение(хотя может время суток сказалось...). ГЫ, посидел щас 3 минуты, и добавил Код (Text): #include <stdio.h> #include <conio.h> int main() { int m,n,r; printf("введи m,n: "); scanf("%d%d",&m,&n); r=m%n; while(r!=0){ if(!(n%r)){ n=r; break;} r=n%r; } printf("наибольший общий делитель= %d",n); getch(); return 0; } Хорошо хоть ананимно отписался. Все, пойду спать ) Только в результате от тривиальных операций избавиться не удалось. Что хочет автор???
Да можно в принципе, только смысл какой? Код (Text): #include <stdio.h> #include <conio.h> int main() { int m,n; printf("enter m,n (m>=n): "); scanf("%d%d",&m,&n); int a[2]; a[0]=m; a[1]=n; int i=1; do{ i=1-i; a[i]%=a[1-i]; } while(a[i]); printf("gcd(m,n)= %d",a[1-i]); getch(); return 0; }
А насколько баллов упражнение? если на <=10 то скорее всего вариант Stiver и будет являться решением.
за это упражнение автор дал 20 баллов. В примечаниях к упражнениям: упражнение с рейтингом 10- простая задача, которая заставляет задуматься над прочитанным, но не представляет особых трудностей. На ее решение вы затратите не больше минуты. То, что представил Stiver, у меня для осмысления займет больше времени. С рейтингом 20- задача, требующая для решения от 15 до 20 минут.
Stiver )) Такая идея у меня тоже вчера возникла, но я решил, что подобный изврат всё-таки противоречит условию эффективности.