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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2011, 19:23   #1
Красноглаз
 
Регистрация: 28.09.2011
Сообщений: 9
По умолчанию Оптимизация

Код:
program evklid;
var
a, b: integer;
begin
writeln('Введите число а = ');
read(a);
writeln('Введите число b = ');
read(b);
 if (a and b)<=0 then
 begin
 writeln('Введите заново число а = ');
 read(a);
 writeln('Введите заново число b = ');
   read(b);
   end
 else
 repeat
  while a>=b do
   a:=a-b;
    if a=0 then writeln('НОД = ',b)
  else while b>a do
   b:=b-a;
   if b=0 then writeln('НОД',a);
   until (b=0) or (a=0);
   end.
Программа должна находить Наибольший Общий Делитель (и она находит=)
Помогите сделать ее более "правильной" чтоли, вообщем как было бы представить алгоритм проще

Последний раз редактировалось Stilet; 28.09.2011 в 20:59.
Красноглаз вне форума Ответить с цитированием
Старый 29.09.2011, 03:39   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Красноглаз Посмотреть сообщение
Программа должна находить Наибольший Общий Делитель (и она находит=)
Помогите сделать ее более "правильной" чтоли, вообщем как было бы представить алгоритм проще
Не обольщайся, Красноглаз.. То, что алгоритм был реализован правильно (хоть и очень нерационально), не означает еще, что программа работает.

1. У тебя неправильная проверка на некорректный ввод (через and). Введи 32 и 12, например, и наслаждайся руганью программы на тебя.

2. Повторный ввод организован совсем неверно. Как в случае правильного, так и неправильного повторного ввода прога просто закончит работу.

3. Теперь та самая "оптимизация". Еще древние греки (а может, и египтяне) уже умели умножать и делить. Теперь, когда есть компьютеры, ты решил, что про умножение можно забыть. Зачем оно? Сложи число сто раз само собой - вот тебе и умножение! Я заменил циклы на формулы, чтоб не нагружать комп лишней работой. ...

4. ... Это повлекло за собой упрощение логической структуры, в главном (и единственном теперь) цикле теперь содержится только один if .. else.

5. Если делать печать ПОСЛЕ выхода из цикла, то количество проверок уменьшится (мы уже ТОЧНО ЗНАЕМ, что одно из чисел равно нулю). Если еще немного подумать, то становится ясно, что в этом случае сумма a+b равна тому числу, которое не равно нулю. Так что проверки при печати УХОДЯТ СОВСЕМ.

6. И последнее: читай вводимые данные не read'ом, а readln'ом. Иначе нажатие Enter'а остается в буфере ввода и может потом влиять на последующий ввод.

7. И самое последнее.. Форматируй код ПРАВИЛЬНО, а не для понту.

Я еще сделаю небольшую оговорку.. Я не вникал в сам алгоритм как таковой. Я просто делал в программе эквивалентные замены (и исправления ЯВНЫХ ошибок). Так что проверяй результаты сам )).

Вот полностью исправленный и оптимизированный код. Вникай.
Код:
program evklid;
var
  a, b: LongInt;  { лучше взять диапазон побольше }
begin
  repeat
    write('Введите число а: ');
    readln(a);
    write('Введите число b: ');
    readln(b);
    if (a<=0) or (b<=0) then Writeln('Incorrect input!  Try again (ctrl-c to exit)')
  until (a>0) and (b>0);
  repeat
    if a>=b then a:= a-((a-b) div b+1)*b else b:= b-((b-a) div a+1)*a;
  until (b=0) or (a=0);
  writeln('НОД = ',a+b)
end.
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 29.09.2011 в 03:46.
TinMan вне форума Ответить с цитированием
Старый 29.09.2011, 11:16   #3
Красноглаз
 
Регистрация: 28.09.2011
Сообщений: 9
По умолчанию

okay, мне в голову ну никак не приходили формулы
Tinman, объясни пожалуйста откуда ты взял эти формулы? ты их сам вывел? как там получается результат такой? в ручную совсем другие цифры

Последний раз редактировалось Красноглаз; 29.09.2011 в 23:38.
Красноглаз вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация... MikeMNN Общие вопросы C/C++ 0 15.12.2010 17:40
оптимизация Terrance! Помощь студентам 8 24.09.2010 10:58
Оптимизация Alex Cones Общие вопросы Delphi 9 07.07.2010 08:47
Оптимизация Flangini Microsoft Office Excel 5 11.06.2009 11:48
Оптимизация Terran Общие вопросы Delphi 3 03.05.2008 19:03