Предыдущая тема :: Следующая тема
|
Автор |
Сообщение |
Igel_B_TyMaHe

Зарегистрирован: 21.09.2005 Сообщения: 53
|
Добавлено: 16 Июн 2006, 21:58 Заголовок сообщения: |
|
|
Eldaron писал(а): | cmp и jne,je,jb итд...вот где правда! |
точно ООП придумал дьявол, чтобы искусить системных программистов. |
|
Вернуться к началу |
|
|
БагиRA

Зарегистрирован: 08.07.2004 Сообщения: 4
|
Добавлено: 18 Июн 2006, 01:23 Заголовок сообщения: |
|
|
зачем в школе ООП изучать? у нас, помнится, были какие-то элементарные программки на бэйсике, что гордо именовалось программированием =) _________________ http://bestiathebest.livejournal.com |
|
Вернуться к началу |
|
|
Igel_B_TyMaHe

Зарегистрирован: 21.09.2005 Сообщения: 53
|
Добавлено: 18 Июн 2006, 10:00 Заголовок сообщения: |
|
|
Бамжара писал(а): |
Как раз IF всегда и для любого языка актуален, без условий-то как программировать можно. |
Вот, кстати, задачка. Сможете придумать алгоритм, например, поиска max из трех чисел, без использования условий? |
|
Вернуться к началу |
|
|
Nouzui
Зарегистрирован: 07.06.2005 Сообщения: 310
|
Добавлено: 18 Июн 2006, 17:47 Заголовок сообщения: |
|
|
Igel_B_TyMaHe писал(а): | Бамжара писал(а): |
Как раз IF всегда и для любого языка актуален, без условий-то как программировать можно. |
Вот, кстати, задачка. Сможете придумать алгоритм, например, поиска max из трех чисел, без использования условий? |
int array[3]= {a, b, c};
int max= a;
while(max<a || max<b || max<c) max= array[(int)rnd(3)];
)) |
|
Вернуться к началу |
|
|
Igel_B_TyMaHe

Зарегистрирован: 21.09.2005 Сообщения: 53
|
Добавлено: 18 Июн 2006, 19:37 Заголовок сообщения: |
|
|
while безусловный оператор? В общем, любые операторы сравнения недопустимы. |
|
Вернуться к началу |
|
|
Nouzui
Зарегистрирован: 07.06.2005 Сообщения: 310
|
Добавлено: 19 Июн 2006, 00:19 Заголовок сообщения: |
|
|
это была шутка в своем роде \
а вообще, без условных операторов это невозможно. единственное, чего здесь можно добиться, так это воспользоваться внутренними сравнениями функций стандартных библиотек.. однако сравнение все равно будет присутствовать, пусть даже и в таком, неявном, виде:
max(a,b)= (a+b+abs(a-b))/2 |
|
Вернуться к началу |
|
|
Igel_B_TyMaHe

Зарегистрирован: 21.09.2005 Сообщения: 53
|
Добавлено: 19 Июн 2006, 19:56 Заголовок сообщения: |
|
|
Имеем три числа a, b и c
забиваем адреса от const до Addr пустыми операторами
прописываем по адресу Addr-k*a:
вывод числа a
выход
прописываем по адресу Addr-k*b:
вывод числа b
выход
прописываем по адресу Addr-k*c:
вывод числа c
выход
Addr = k*(максимально допустимое число)+const
k=размеру кода (вывод числа; выход)
const=размер кода записи, записывающий код вывода чисел.
При выполнении программы будет выведено максимальное из трех чисел. И никаких условий  |
|
Вернуться к началу |
|
|
Nouzui
Зарегистрирован: 07.06.2005 Сообщения: 310
|
Добавлено: 20 Июн 2006, 20:06 Заголовок сообщения: |
|
|
((a+b)>>sizeof(int)*8-1)*(a-b)+b |
|
Вернуться к началу |
|
|
Igel_B_TyMaHe

Зарегистрирован: 21.09.2005 Сообщения: 53
|
Добавлено: 20 Июн 2006, 20:09 Заголовок сообщения: |
|
|
Nouzui писал(а): | ((a+b)>>sizeof(int)*8-1)*(a-b)+b |
Слабо понимаю запись, но верю А говорил - невозможно  |
|
Вернуться к началу |
|
|
Nouzui
Зарегистрирован: 07.06.2005 Сообщения: 310
|
Добавлено: 20 Июн 2006, 21:12 Заголовок сообщения: |
|
|
Igel_B_TyMaHe писал(а): | Nouzui писал(а): | ((a+b)>>sizeof(int)*8-1)*(a-b)+b |
Слабо понимаю запись, но верю А говорил - невозможно  |
согласен, погорячился )) просто числа не абстрактные, а реальные машинные, поэтому и удается..
кстати, твой способ тооже основан на сравнении, только происходит оно не в процессоре, а в памяти |
|
Вернуться к началу |
|
|
PGM
Зарегистрирован: 24.10.2003 Сообщения: 68 Откуда: Королев
|
Добавлено: 21 Июн 2006, 00:46 Заголовок сообщения: |
|
|
Nouzui писал(а): | ((a+b)>>sizeof(int)*8-1)*(a-b)+b |
a=1
b=2
sizeof(int) = 4
(3 >> 4 * 8 - 1)*(-1) + 2 = 3 -- и это максимум? или я чего не понял? может поясните? или ">>" это не сдвиг?
А по поводу словесной программы Igel_B_TyMaHe - она как раз практически-то не очень применима - достаточно прикинуть сколько памяти для кода надо чтобы сравнить любые целые (4-байтовые например) числа. А идея занятная - нельзя ли как-то ее использовать, но не поедать столько памяти? Используя скажем сдвиги и выясняя чей бит дальше сдвинется - того и шапка.
А как такой вариант решения:
Код: | max = sign(a-b) * b + sign(b-a) * a | (sign - возвращает значение первого бита - ну там можно сдвигом его и "and 1" - имея ввиду "машинные" операции с целыми знаковыми естественно)
Правда с равными числами не сработает. Но это условие можно тоже попытаться перекрыть при помощи sign от других разностей. _________________ "Не ботфортом консомэ хлебаем" |
|
Вернуться к началу |
|
|
Nouzui
Зарегистрирован: 07.06.2005 Сообщения: 310
|
Добавлено: 21 Июн 2006, 01:07 Заголовок сообщения: |
|
|
PGM писал(а): | Код: | max = sign(a-b) * b + sign(b-a) * a | (sign - возвращает значение первого бита - ну там можно сдвигом его и "and 1" - имея ввиду "машинные" операции с целыми знаковыми естественно)
Правда с равными числами не сработает. Но это условие можно тоже попытаться перекрыть при помощи sign от других разностей. |
А я именно это и предложил ))
(a+b)>>sizeof(int)*8-1 - это старший бит (a-b) - у вычитания приоритет выше, чем у сдвига, то есть, если расставить скобки, получится вот что:
Код: | ((a+b)>>(sizeof(int)*8-1)) | работает, вроде, и для одинаковых чисел, но не учитывает переполнения...
гм.. а решение с памятью - это, если присмотреться, фактически что-то вроде вот этого:
for(int i= MAX_INT; ; i--)
{
if(i==a) return a;
if(i==b) return b;
if(i==c) return c;
}
только сравнения осуществляются микросхемой памяти..
такая вот фишка )) |
|
Вернуться к началу |
|
|
PGM
Зарегистрирован: 24.10.2003 Сообщения: 68 Откуда: Королев
|
Добавлено: 21 Июн 2006, 01:38 Заголовок сообщения: |
|
|
Nouzui писал(а): | А я именно это и предложил ))
(a+b)>>sizeof(int)*8-1 - это старший бит (a-b) - у вычитания приоритет выше, чем у сдвига, то есть, если расставить скобки, получится вот что:
Код: | ((a+b)>>(sizeof(int)*8-1)) | работает, вроде, и для одинаковых чисел, но не учитывает переполнения...
|
Ну тогда может все-таки (a-b), а не (a+b) в первой скобке?
Nouzui писал(а): |
гм.. а решение с памятью - это, если присмотреться, фактически что-то вроде вот этого:
for(int i= MAX_INT; ; i--)
{
if(i==a) return a;
if(i==b) return b;
if(i==c) return c;
}
только сравнения осуществляются микросхемой памяти..
такая вот фишка )) |
Ну да, только сколько памяти потребуется. Да и вовсе не микросхемой памяти, а процессором тогда уж, когда он по виртуальным адресам "топает". _________________ "Не ботфортом консомэ хлебаем" |
|
Вернуться к началу |
|
|
Nouzui
Зарегистрирован: 07.06.2005 Сообщения: 310
|
Добавлено: 22 Июн 2006, 00:05 Заголовок сообщения: |
|
|
PGM писал(а): |
Ну тогда может все-таки (a-b), а не (a+b) в первой скобке?
|
ну да, минус
так вот они, баги, и берутся ))
PGM писал(а): |
Да и вовсе не микросхемой памяти, а процессором тогда уж, когда он по виртуальным адресам "топает". |
а по-моему - памятью. это ведь она дешифрует адрес и возвращает при совпадении другой код операции... |
|
Вернуться к началу |
|
|
Dwarflord

Зарегистрирован: 16.05.2004 Сообщения: 383
|
Добавлено: 24 Дек 2006, 17:07 Заголовок сообщения: |
|
|
Кому не лень подумать, просьба помочь.
Подумать тут требуется.
Задан шаблон, состоящий из круглых скобок и знаков вопроса. Требуется определить, сколькими способами можно заменить знаки вопроса круглыми скобками так, чтобы получилось правильное скобочное выражение.
Формат входных данных
Первая строка входного файла содержит заданный шаблон длиной не более 80 символов.
Формат выходных данных
Выведите в выходной файл искомое количество способов. Исходные данные будут таковы, что это количество не превзойдет 2*10^9.
Пример
input.txt output.txt
????(? 2 _________________ С уважением, Пётр
 |
|
Вернуться к началу |
|
|
|