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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2012, 18:20   #1
Paster Fob
Форумчанин
 
Аватар для Paster Fob
 
Регистрация: 06.02.2011
Сообщений: 105
Счастье Сложная задача

Всем привет.Как-то раз попалась мне такая вот задачка:
Даны два целых числа a и b. Если a делится на b (без остатка) или b делится на a (без остатка), то вывести 1, иначе - любое другое число. Условные операторы и операторы циклов не использовать.
Так я её и не смог осилить.Сможет кто-нибудь решить такое?
Paster Fob вне форума Ответить с цитированием
Старый 11.05.2012, 18:47   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Потестируйте получше.
Код:
uses
  crt;

var
  a, b: integer;

begin
  readln(a, b);
  a := abs(a);
  b := abs(b);
  writeln(1 div (1 + 1 div (1 + b) + 1 div (1 + a) + (a mod (b + 1 div (1 + b))) * (b mod (a + 1 div (1 + a)))));
  readln;
end.
УПД Вроде "обходит" нули.
Если одно из чисел 0, то ответ 0, т.е. числа не делятся без остатка.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.05.2012 в 18:57.
BDA вне форума Ответить с цитированием
Старый 11.05.2012, 19:49   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Код:
writeln(ord(((a mod b) = 0) or ((b mod a)=0)));
s-andriano вне форума Ответить с цитированием
Старый 11.05.2012, 19:51   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

s-andriano, да-да, логические выражения)
забываю)
Правда, если а или б равны 0, то возникнет ошибка.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.05.2012, 20:49   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Строго говоря, 0 противоречит условиям задачи.
Но вполне с Вами согласен, что правильная программа должна корректно работать и с некорректными данными.
Можно добавить в логическое выражение
Код:
and ((a*b)<>0)
Только нужно добавить с "правильной" стороны (не помню, логические выражения вычисляются слева направо или справа налево).
s-andriano вне форума Ответить с цитированием
Старый 11.05.2012, 20:58   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Слева направо. И оптимизатор на всякий случай включить. Имею ввиду опцию останова когда логические выражения получают однозначный ответ, и продолжение вычисления не требуется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2012, 21:54   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

В связи с этой задачкой вспомнилась история.
На самом деле программирование без условных операторов - не такая уж экзотика, как может показаться.
Совсем недавно такое имело место в видеокартах.
Сначала всю картинку, которую надо было вывести на экран, генерировал процессор, но оказалось, что мощности центрального процессора для этого недостаточно.
Поэтому появилось устройство, которое у нас принято называть 3D-ускорителем, а более правильно - GPU.
Первые GPU имели некоторую стандартную функциональность, которой можно было управлять, грубо говоря, при помощи ручек и тумблеров. Т.е. имелся некоторый алгоритм, в котором можно было менять отдельные коэффициенты и включать/выключать отдельные блоки.
Потом появились первые шейдерные блоки, предназначенные для выполнения шейдеров - небольших программ для обработки отдельных фрагментов. Начиная с этого момента, программист мог запрограммировать собственный алгоритм, а не пользоваться стандартным. Шейдерный процессор за счет специализации, конечно, был несколько мощнее центрального, но не настолько, чтобы удовлектворить все возросшие аппетиты любителей трехмерной графики. Чтобы добиться от видеокарты достаточной производительности, GPU включал в себя несколько шейдерных блоков, каждый из которых работал по написанной программистом программе. Но при этом для синхронизации блоков между собой программа должна была выполняться одинаковое количество тактов. Но том уровне проще всего этого было добиться, исключив из системы команд условные переходы. Формально в языке высокого уровня условные операторы были, но они имели любопытную реализацию:
- вычислялись ОБЕ ветки за условием,
- вычислялось условие и расширялось на всю длину слова (т.е. TRUE состоял из одних двоичных единиц, а FALSE - из одних нулей),
- ветка if логически умножалась на это число, а ветка else - на его инверсию, после чего результат складывался.
Очевидно, эта была очень неэффективная реализация, т.к. приходилось считать много того, что принципиально не нужно и будет затем все равно умножено на 0. Соответственно, был спрос на оптимально написанные шейдеры, не содержащие условных переходов и потому быстро выполняющиеся на GPU.
s-andriano вне форума Ответить с цитированием
Старый 14.05.2012, 21:16   #8
Алекс!
 
Регистрация: 03.11.2011
Сообщений: 9
По умолчанию

writeln(a mod b +1);
Алекс! вне форума Ответить с цитированием
Старый 14.05.2012, 23:04   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Алекс! Посмотреть сообщение
writeln(a mod b +1);
a=2
b=4

Должно быть 1, а у Вас?
s-andriano вне форума Ответить с цитированием
Старый 16.05.2012, 16:48   #10
Алекс!
 
Регистрация: 03.11.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
a=2
b=4

Должно быть 1, а у Вас?
Извиняй ошибка
Алекс! вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложная задача! Pashok6 Паскаль, Turbo Pascal, PascalABC.NET 10 02.01.2012 00:03
задача сложная Tolian92 Паскаль, Turbo Pascal, PascalABC.NET 2 08.12.2011 15:20
Сложная задача(( альбертоо Паскаль, Turbo Pascal, PascalABC.NET 1 07.12.2011 16:57
Сложная задача. ВДПУ Помощь студентам 4 07.11.2011 22:34
сложная задача ugradvizhok Помощь студентам 1 30.03.2011 23:30