Алгоритм евклида для трех чисел программа

Выполняю задание по нахождению Нод по алгоритму Стейна. Ниже решение работает для двух целых чисел, но проблема возникает в методе для трех чисел, не все значения теста проходят (в задании есть юнит тесты ) а именно 0 , 0, -1; выкидывает исключение ArgumentException. Понимаю почему вылетает исключение но не понимаю что с этим делать , как сделать так чтобы проходили эти значения тоже?

public static int GetGcdByStein(int a, int b) < if (a == 0 b == 0) throw new ArgumentException(«all numbers are 0 at the same time «); else if (a == int.MinValue || b == int.MinValue) throw new ArgumentOutOfRangeException(nameof(a), nameof(b), «numbers are int.MinValue»); a = Math.Abs(a); b = Math.Abs(b); if (a == b) return a; if (a == 0) return b; if (b == 0) return a; if (a % 2 == 0) < if (b % 2 == 0) return 2 * GetGcdByStein(a / 2, b / 2); else return GetGcdByStein(a / 2, b); >if (b % 2 == 0) return GetGcdByStein(a, b / 2); if (a > b) return GetGcdByStein((a — b) / 2, b); return GetGcdByStein(a, (b — a) / 2); > // метод для трех чисел . public static int GetGcdByStein(int a, int b, int c)
Отслеживать
задан 18 мар 2021 в 11:49

57 5 5 бронзовых знаков
«Понимаю почему вылетает исключение» — почему?
– user176262
18 мар 2021 в 12:07

Алгоритм Евклида для трёх чисел?

Не совсем понятен вопрос, то есть у вас a = 0, b = 0, c = -1 вы вызываете функцию с тремя аргументами, в которой вызывается функция с двумя и в которую передается 0, 0 , а в этой функции есть проверка на a == 0 b == 0 , в следствии чего вылетает ArgumentException . Я правильно понимаю?

Читайте также:
Как установить программу прокси

Единственное, что приходит в голову так это убрать эту проверку) А вообще при gcd(a, b) только a не может равняться 0, b может. Так что в любом случае при 0 0 -1 должна быть ошибка.

18 мар 2021 в 12:08

Даже если вспомнить тот факт, что gcd(a, b, c) = gcd(gcd(a, b), c) = gcd(a, gcd(b, c)) = gcd(gcd(a, c), b) и попробуйте сделать так, чтобы первым аргументом не было 0 . Спойлер! Не получиться. Так что ошибка точно должна быть

18 мар 2021 в 12:12
18 мар 2021 в 12:19
18 мар 2021 в 12:30

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Не знаю насколько актуально, но привожу небольшую модификацию вашего кода.

private static int GetGcdByStein(int a, int b) < //if (a == 0 b == 0) throw new ArgumentException(«all numbers are 0 at the same time «); //Здесь ошибка, т.к. НОД(n, n) = n if (a == int.MinValue) throw new ArgumentOutOfRangeException(nameof(a), int.MinValue, «number is int.MinValue»); if (b == int.MinValue) throw new ArgumentOutOfRangeException(nameof(b), int.MinValue, «number is int.MinValue»); a = Math.Abs(a); b = Math.Abs(b); if (a == b) return a; if (a == 0) return b; if (b == 0) return a; if (a % 2 == 0) //четное < if (b % 2 == 0) return 2 * GetGcdByStein(a / 2, b / 2); return GetGcdByStein(a / 2, b); >if (b % 2 == 0) return GetGcdByStein(a, b / 2); if (a > b) return GetGcdByStein((a — b) / 2, b); return GetGcdByStein(a, (b — a) / 2); > public static int GetGcdByStein(int a, int b, int c) < int ab; try < ab = GetGcdByStein(a, b); >catch (Exception e) < //Console.WriteLine(«Exception detected when calculating Gcd of two parameters.»); Console.WriteLine(e.Message); throw; >return GetGcdByStein(ab, c); > private static void Main() < int a = 34, b = 17, c = 68; int[][] ar = < new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , new[] , >; for (int i = 0; i < ar.Length; i++) < int[] subAr = ar[i]; try < if (subAr.Length == 2) Console.WriteLine($». Gcd(, ) = «); else if (subAr.Length == 3) Console.WriteLine( $». Gcd(, , ) = «); > catch (ArgumentException e) < Console.WriteLine(e); >finally < Console.WriteLine(«********************»); >> Console.WriteLine(«Press Enter to exit. «); Console.ReadLine(); >

Читайте также:
Программы чтобы разговаривать с другом

Кстати, деление на 2 можно было заменить сдвигом, как это чаще всего и делают.

Алгоритм Евклида

Источник: ru.stackoverflow.com

Найти наибольший общий делитель трех заданных натуральных чисел, используя алгоритм Евклида — Turbo Pascal

№107Найти наибольший общий делитель трех заданных натуральных чисел, используя алгоритм Евклида и учитывая, что НОД(а, Ь, с) = НОД(НОД(а, Ъ), с).

Код к задаче: «Найти наибольший общий делитель трех заданных натуральных чисел, используя алгоритм Евклида»

Листинг программы

uses crt; function ReadN(c: Char): Integer; var n: Integer; begin repeat Write(‘Введите ‘, c, ‘>0 = ‘); Readln(n); until n>0; ReadN:=n; end; function NOD(a, b: Integer): Integer; var t: Integer; begin if (a>0) and (b>0) then begin if b>a then begin t:=a; a:=b; b:=t; end; repeat t:=b; b:=a mod b; a:=t; until b=0; NOD:=a; end else NOD:=1; end; var a, b, c: Integer; begin ClrScr; a:=ReadN(‘a’); b:=ReadN(‘b’); c:=ReadN(‘c’); Writeln(‘НОД (a, b, c) = ‘, NOD(NOD(a, b), c)); Readkey; end.

Источник: studassistent.ru

Составьте программу нахождения наибольшего общего делителя трех чисел, используя следующую формулу: НОД(А, В, С) * НОД(НОД(А, В), С).

Информатика 9 класс Семакин ФГОС

Program zz1;
Var a,b,c:integer; // задаем переменные целого типа
Function Nod(a,b:integer):integer; // вспомогательный алгоритм
Begin
While a<>b do // организуем цикл, используем алгоритм Евклида
if a>b // проверяем условие, если первое число больше второго
then a:=a-b // то, от первого отнимаем второе
else b:=b-a; // иначе, от второго отнимаем первое
Nod:=a; // в связи с тем, что по окончании цикла два числа сравняются, ответом является любое из них
End;
begin
write(‘ Введите три числа ‘); // вводим с клавиатуры три заданных числа
readln(a,b,c);
writeln(‘ НОД трех чисел = ‘, Nod(Nod(a,b),c));
end.

Читайте также:
Что такое бинарные программы

Понравилась статья? Поделиться с друзьями:

Источник: murnik.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru