Вычисление НОД при помощи бинарного алгоритма - C (СИ)

Узнай цену своей работы

Формулировка задачи:

задание такое: необходимо посчитать НОД по бинарному алгоритму. Алгоритм такой: 1.Если m, n чётные, то НОД(m, n) = 2*НОД(m/2, n/2); 2.Если m чётное, n нечётное, то НОД(m, n) = НОД(m/2, n); 3.Если n чётное, m нечётное, то НОД(m, n) = НОД(m, |m-n|); 4.Если m, n нечётные, то НОД(m, n) = НОД(n, |m - n|). пример (1173,323)=(323,850)=(323,425)=(323,102)=…=(51,17)=(17,34)=(17,17)=17 я попыалась написать код, правда без цикла (так как не понимаю как его сделать), но совсем не уверена в его правильности
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. void main ()
  4. {
  5. printf ("\n\n Laboratornaya rabota 2");
  6. printf ("\n\n Zadanie 2");
  7. printf ("\n Vichislit NOD (m,n) po binarnomy algoritmy ");
  8. int m, n;
  9. int a,b;
  10. printf ("\n\n vichislim NOD");
  11. printf (" dlya dvuh celih chisel m i n. \n");
  12. printf ("\n vvedite v odnoj stroke dva celih chisla");
  13. printf (" i nazhmite <enter>");
  14. printf ("->");
  15. scanf ("%i%i", &m, &n);
  16. printf ("\n NOD chisel %i i %i - raven ", m, n);
  17. if ((m%2==0)&&(n%2==0))
  18. {
  19. a=m/2;
  20. b=n/2;
  21. }
  22. else if ((m%2==0)&&(n%2>0))
  23. {
  24. a=m/2;
  25. b=n;
  26. }
  27. else if ((m%2>0)&&(n%2==0))
  28. {
  29. a=n;
  30. if (n>m)
  31. b=n-m;
  32. else
  33. b=m-n;
  34. }
  35. else if ((m%2>0)&&(n%2>0))
  36. {
  37. if (n>m)
  38. a=n-m;
  39. else
  40. a=m-n;
  41. b=m;
  42. }
  43. printf ("%i\n", a);
  44. getch();
  45. }

Решение задачи: «Вычисление НОД при помощи бинарного алгоритма»

textual
Листинг программы
  1. #include<iostream>
  2. #include <stdio.h>
  3. #include <conio.h>
  4. void main ()
  5. {
  6. printf ("\n\n Laboratornaya rabota 2");
  7. printf ("\n\n Zadanie 2");
  8. printf ("\n Vichislit NOD (m,n) po binarnomy algoritmy ");
  9. int m, n, temp;
  10. printf ("\n\n vichislim NOD");
  11. printf (" dlya dvuh celih chisel m i n. \n");
  12. printf ("\n vvedite v odnoj stroke dva celih chisla");
  13. printf (" i nazhmite <enter>");
  14. printf ("->");
  15. scanf ("%i%i", &m, &n);
  16. printf ("\n NOD chisel %i i %i - raven ", m, n);
  17. while(m!=n)
  18. {
  19. if ((m%2==0)&&(n%2==0))
  20. {
  21. m=m/2;
  22. n=n/2;
  23. }
  24. else if ((m%2==0)&&(n%2>0))
  25. {
  26. m=m/2;
  27. }
  28. else if ((m%2>0)&&(n%2==0))
  29. {
  30. if (n>m)
  31. n=n-m;
  32. else
  33. n=m-n;
  34. }
  35. else if ((m%2>0)&&(n%2>0))
  36. {
  37. temp=n;
  38. if (n>m)
  39. n=n-m;
  40. else
  41. n=m-n;
  42. m=temp;
  43. }
  44. }
  45. printf ("%i\n", n);
  46. getch();
  47. }

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Объявляем функцию main()
  3. Выводим название и номер задачи
  4. Объявляем переменные m, n, temp и инициализируем их значениями 0
  5. Выводим сообщение о том, что будет вычислен НОД при помощи бинарного алгоритма
  6. Запрашиваем у пользователя ввод двух целых чисел, используя функцию scanf()
  7. Выводим сообщение о том, что введенные числа равны
  8. Запускаем цикл while, который будет выполняться до тех пор, пока m не станет равным n
  9. Внутри цикла проверяем, являются ли оба числа четными и если да, то делим их на 2
  10. Если только одно из чисел четное, то необходимо перенести его в переменную temp и затем в переменную m или n в зависимости от того, какое число больше
  11. Если оба числа нечетные, то необходимо перенести большее число в переменную temp, а затем в переменную m или n в зависимости от того, какое число больше
  12. После выхода из цикла while, выводим значение переменной n
  13. Завершаем программу при помощи функции getch()

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы