Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/429: Рейтинг темы: голосов - 429, средняя оценка - 4.65
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39

Алгоритм сравнения трех чисел

29.04.2009, 22:30. Показов 84805. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Голову сломал уже. Подскажите оптимальный алгоритм сравнения трех чисел. Необходимо учесть все варианты, в том числе равенство. У меня получается не 10 сравнений, а это много.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2009, 22:30
Ответы с готовыми решениями:

Ветвление. Если сумма трех попарно различных действительных чисел x, y, z меньше 1, то наименьшее из этих трех чисел заменить полусуммой двух других
Если сумма трех попарно различных действительных чисел x, y, z меньше 1, то наименьшее из этих трех чисел заменить полусуммой двух других;...

Нужно составить программу для нахождения наибольшего общего делителя трех натуральных чисел используя алгоритм Евклида
Нужно составить программу для нахождения наибольшего общего делителя трех натуральных чисел используя алгоритм евклида.

Написать алгоритм нахождения меньшего из трех чисел
помогите пожалуйста...никак не могу сделать в Turbo Pascale..... Написать алгоритм нахождения меньшего из трех чисел контрольный...

38
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
29.04.2009, 22:37
а исплользовать массив пробовали?
0
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
29.04.2009, 22:43  [ТС]
все должно быть просто (на операторе if) без массива
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.04.2009, 22:51
Есть а, б и с.
Проверяем на равенство а, б и с. Это три сравнения, как максимум. Если какие-нибудь из них равны, то дальше все решается за одну преверку.
Если все неравны, то дальше, если а больше, чем б, и с больше, чем а, то все понятно.
Если а больше б, а с не больше а, то сравниваем еще с с б и тоже все понятно.
Если а не больше б, то абсолютно тоже самое получается, только на месте большего а у нас теперь б.
та же байда для остальных чисел, только буквы разные.
Получается, в самом "удачном" случае 6 проверок.

Это первое, что мне в голову пришло. Думаю, есть и лучше решение.
0
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
29.04.2009, 23:30  [ТС]
Vourhey,
Проверяем на равенство а, б и с. Это три сравнения, как максимум. Если какие-нибудь из них равны, то дальше все решается за одну проверку.
. Как решается за одну проверку? Нужно ведь знать какая пара равна
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.04.2009, 23:46
Это ты и узнаешь на стадии "Проверяем на равенство а, б и с". Мдя...как ни странно...
0
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
29.04.2009, 23:51  [ТС]
Нет, видимо мне сегодня не понять
Вот мой код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
program three_numers;
var a,b,c: integer;
begin
writeln ('Введите три целых числа (a b c)');
readln (a,b,c);
if ((a=b) and (a=c) and (b=c)) then
   begin
   if ((a>b) and (a>c))  then
      writeln ('a больше b и c');
   if ((a<b) and (b>c)) then
      writeln ('b больше a и c');
   if ((a<c) and (b<c)) then
      writeln ('c больше a и b');
   end
else
  begin
    if ((a=c) and (a=b)) then
       writeln ('a, b и c равны');
    if ((a=b) and (a>c)) then
       writeln ('a и b равны и больше c');
    if ((a=b) and (a<c)) then
    writeln ('a и b равны и меньше c');
    if ((a=c) and (a>b)) then
    writeln ('a и c равны и больше b');
    if ((a=c) and (a<b)) then
    writeln ('a Ёи c равны и меньше b');
    if ((b=c) and (a<b)) then
    writeln ('b и c равны и меньше a');
    if ((b=c) and (a>b)) then writeln ('b и c равны и меньше a');
  end;
readln;
end.
а вот рецензия: очень уж много операций сравнения, задача решается гораздо компактнее и красивее.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.04.2009, 23:55
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
if ((a=b) and (a=c) and (b=c)) then
   begin
   if ((a>b) and (a>c))  then
      writeln ('a больше b и c');
   if ((a<b) and (b>c)) then
      writeln ('b больше a и c');
   if ((a<c) and (b<c)) then
      writeln ('c больше a и b');
   end
Читаю, твое условие и плачу... Если а равно б. б равно с. и а равно с, то ты еще делаешь какие-то проверки пипец...
Вот по моему скромному мнению, что если а равен и б и с, когда с еще и равен б, то они все равны.
Моя рецензия: лечить.
0
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
30.04.2009, 00:11  [ТС]
упс, ошибся у меня там
Pascal
1
if ((a<>b) and (a<>c) and (b<>c))  then
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
30.04.2009, 00:31
Тогда реши через булевы операции. Может, количество проверок сократится.
1
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
30.04.2009, 01:27  [ТС]
Понял, спасибо! Вот что получилось:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
program three_numers;
uses crt;
var a,b,c: integer;
    x,y,z: boolean;
begin
writeln ('Введите три целых числа (a b c)');
readln (a,b,c);
x:=(a=b);
y:=(a=c);
z:=(b=c);
if ((x=y) and (y=true)) Then WriteLN ('Все числа равны');
 
if ((x=true) and (y=false)) Then
    if a>c Then WriteLN ('a и b равны и больше с')
    else WriteLN ('a и b равны и меньше с');
if ((y=true) and (z=false)) Then
    if a>b Then WriteLN ('a и c равны и больше b')
    else WriteLN ('a и c равны и меньше b');
if ((z=true) and (x=false)) Then
    if a<b Then WriteLN ('b и c равны и больше a')
    else WriteLN ('b и c равны и меньше a');
 
if ((a>b) and (a>c) and (z=false)) Then WriteLN ('a больше, чем b и с');
if ((a<b) and (b>c) and (y=false)) Then WriteLN ('b больше, чем a и с');
if ((a<c) and (b<c) and (x=false)) Then WriteLN ('c больше, чем a и b');
 
ReadLN;
end.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
30.04.2009, 01:48
У меня вот такая байда получилась:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  writeln('Input a,b,c:');
  readln(a,b,c);
  if(a=b)then
    if(b=c)then writeln('a=b=c')
    else if(b>c)then writeln('a,b - max, c - min')
    else writeln('c - max, a,b - min')
  else if(b=c)then
    if(a>c)then writeln('a - max, b,c - min')
    else writeln('c,b - max, a - min')
  else if(a>b)then
    if(c>a)then writeln('C - max, B - min')
    else if(c>b)then writeln('A - max, B - min')
    else writeln('A - max, C - min')
  else
    if(c>b)then writeln('C - max, A - min')
    else if(c>a)then writeln('B - max, A - min')
    else writeln('B - max, C - min');
Вообщем-то, максимум здесь пять if'ов проходит, не больше. И без переменных. Опять же, не ручаюсь, что это самый быстрый вариант, хотя, мне он кажется таковым )
1
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
30.04.2009, 02:11  [ТС]
Пять If-ов проходит при наихудшем варианте, а всего в коде их 10. И тем не менее спасибо за то что откликнулись и за мысли, а то я уже отчаялся. В диалоге рождается истина. На этом форуме нашел еще код г-на Puporeva на ту же тему только без учета равенства, но идея интересная:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uses wincrt;
var a,b,c,mx,mn,mx1,mn1,mx2,mn2:integer;
begin
clrscr;
write('a=');readln(a);
write('b=');readln(b);
write('c=');readln(c);
mx1:=(a+b+abs(a-b)) div 2;{1й макс}
mx2:=(mx1+c+abs(mx1-c)) div 2;{2й макс}
mx:=(mx1+mx2+abs(mx1-mx2)) div 2;{итог}
mn1:=(a+b-abs(a-b)) div 2;{1й мин}
mn2:=(mn1+c-abs(mn1-c)) div 2;{2й мин}
mn:=(mn1+mn2-abs(mn1-mn2)) div 2;{итог}
writeln('max=',mx,'  min=',mn);
readln
end.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
30.04.2009, 08:14
Погоди. Нам же нужен оптимальный вариант, а не тот, в котором меньше ифов визуально. Или ты задание неправильно дал? Без учета равенства в две строки считается.
0
2923 / 844 / 324
Регистрация: 30.04.2009
Сообщений: 2,633
30.04.2009, 08:31
У меня Вот какой вопрос, для чего тебе это нужно, если именно для того чтобы выводить такие надписи или для чего то конкретно?
0
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
30.04.2009, 08:58  [ТС]
Vourhey, да, ты прав. Запутался уже совсем. Сказалось то что уже сутки просидел за этим заданием.
mamedovvms, мне это надо потому, что задание такое.

Вот исходный текст задания: "Написать команду определения максимального из 3-х введенных с клавиатуры целых чисел. Предусмотреть все варианты (в т.ч. равенство значений)."
После того как сдал свой первый вариант была такая рецензия: "Очень уж много операций сравнения, задача решается гораздо компактнее и красивее."
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
30.04.2009, 09:18
Блин! Найти максимальное и сравнить все числа Это разные вещи. Максимальное находится, как нефиг делать. Эх ты... :-)

Добавлено через 1 минуту 21 секунду
Считай, что зря потратил наше время
0
3 / 3 / 0
Регистрация: 23.04.2009
Сообщений: 39
30.04.2009, 10:02  [ТС]
Ну что ж, бывает. Виноват, каюсь
0
2923 / 844 / 324
Регистрация: 30.04.2009
Сообщений: 2,633
30.04.2009, 10:24
ну так что ты нашел ответ на свой вопрос или так и не сделал?
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.04.2009, 10:31
Написать команду определения максимального из 3-х введенных с клавиатуры целых чисел. Предусмотреть все варианты (в т.ч. равенство значений)."
Вот нутром чуял, что именно такое задание. До чего вы господа любите исковеркать начальное условие, а потом пудрить мозги себе и людям.
Pascal
1
2
3
mx:=a;
if b>mx then mx:=b;
if c>mx then mx:=c;
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.04.2009, 10:31
Помогаю со студенческими работами здесь

Составить алгоритм нахождения суммы большего и меньшего из трёх чисел
Составить алгоритм нахождения суммы большего и меньшего из трёх чисел

Построить алгоритм нахождения большего из двух чисел. Найти большее из трех
Построить алгоритм нахождения большего из двух чисел; оформить его как вспомогательный и использовать для нахождения большего из трех...

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

Если сумма трех попарно различных действительных чисел X Y Z меньше единицы, то наименьшее из этих трех чисел заменить полусуммой двух других
Если сумма трех попарно различных действительных чисел X Y Z меньше единицы, то наименьшее из этих трех чисел заменить полусуммой двух...

Сосчитайте, сколько шестизначных чисел имеют одинаковые суммы трех первых и трех последних цифр
Нужны программы с 3-мя разными циклами: while, for и repeat. И желательно с объяснением.):declare: Добавлено через 3 минуты Знаю,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru