Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2016, 11:20   #1
igormel
Пользователь
 
Регистрация: 11.11.2016
Сообщений: 22
По умолчанию FreePascal. Заданы числа A, B, C, D. Найти наибольшие общие делители пар A и B, A и C, A и D.

Нужно решить задачу с использованием процедур и процедур-функций, определяемых программистом. Программа FreePascal.
Заданы числа A, B, C, D. Найти наибольшие общие делители пар A и B, A и C, A и D.
Я так понимаю, её нужно решать через function.
Заранее огроменное спасибо, т.к. я в этом не особо шарю)
igormel вне форума Ответить с цитированием
Старый 27.11.2016, 11:55   #2
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
function ab(a,b:integer):integer;
var i,c:integer;
begin
   c:=a;
   If b<a then
      c:=b;
   Result:=c;
   For i:=c downto 1 do
      If (a mod i=0) and (b mod i=0) then
      begin
         Result:=i;
         Exit;
      end;
end;

var a,b,c,d:integer;
begin
   Write('A = '); Readln(a);
   Write('B = '); Readln(b);
   Write('C = '); Readln(c);
   Write('D = '); Readln(d);
   Writeln(ab(a,b));
   Writeln(ab(a,c));
   Writeln(ab(a,d));
   Readln;
end.
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 28.11.2016, 14:36   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Если не в лоб, а использовать, к примеру, алгоритм Эвклида, получается изящней и быстрее.
Например, для пары 7000 и 7002 будет 0 иттераций вместо 6999 .
Ну возможно, я и неправ: трудно спорить с человеком, у которого репутация круче моей в 500 раз
Код:
function ab(a,b:integer) : integer ;
var t : integer;
  begin
     while (a<>b) do
       begin
         if a>b then begin t := a ; a := b ; b:= t end ;
         b := b - a 
       end ;
     Result := a ;
  end ;

Последний раз редактировалось digitalis; 28.11.2016 в 14:43.
digitalis вне форума Ответить с цитированием
Старый 28.11.2016, 20:07   #4
Dekay
Пользователь
 
Регистрация: 21.06.2016
Сообщений: 65
По умолчанию

Цитата:
Например, для пары 7000 и 7002 будет 0 иттераций вместо 6999 .
Нет.
Цитата:
b := b - a
Используйте мод. Будет быстрее. Намного
Dekay вне форума Ответить с цитированием
Старый 28.11.2016, 20:16   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Dekay Посмотреть сообщение
Используйте мод. Будет быстрее. Намного
так?

http://www.programmersforum.ru/showp...56&postcount=5

http://www.programmersforum.ru/showp...57&postcount=2
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2016, 20:19   #6
Dekay
Пользователь
 
Регистрация: 21.06.2016
Сообщений: 65
По умолчанию

Можно и так.
Только я за рекурсивный вариант с одним модом.
Dekay вне форума Ответить с цитированием
Старый 28.11.2016, 20:23   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Dekay Посмотреть сообщение
Только я за рекурсивный вариант с одним модом.
не, не согласен.
рекурсия там, где без неё можно обойтись - зло.
Хотя, конечно, вариант с рекурсией выглядит проще!

p.s. он тоже на форуме представлен.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2016, 20:32   #8
Dekay
Пользователь
 
Регистрация: 21.06.2016
Сообщений: 65
По умолчанию

тыц
Разве это некрасиво?
Да и глубина рекурсии не больше логарифма. Не так критично
Dekay вне форума Ответить с цитированием
Старый 29.11.2016, 10:36   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Да, ошибся малость ... Для выбранной пары разница 3500 против 6999 . Может быть, для другой пары аргументов соотношение будет и обратным. Нужно организовать НИР на предмет диссертации

Последний раз редактировалось digitalis; 29.11.2016 в 11:05.
digitalis вне форума Ответить с цитированием
Старый 29.11.2016, 18:03   #10
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Надо еще алгоритм на битовых операциях расмотреть с рекурсией и без. Он побыстрее будет. Как раз для НИР)
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C#: Найти делители данного натурального числа N, которые являются квадратами какого то числа Х Namatrasnik Помощь студентам 1 20.10.2016 16:14
найти все простые делители числа н keyshia_nicole Visual C++ 0 31.01.2014 18:39
Найти все общие делители двух чисел (осталось оптимизировать) KObotan Общие вопросы C/C++ 4 13.09.2012 01:27
Pascal. Найти все делители числа N torah Помощь студентам 0 24.11.2010 10:37
Найти все делители числа N torah Помощь студентам 33 06.11.2010 00:15