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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2012, 08:49   #11
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Plague Посмотреть сообщение
Когда топик прочел вчера, тоже вспомнил про этот рассказ
astecenko вне форума Ответить с цитированием
Старый 25.07.2012, 09:45   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
для отрицательного n не прокатит
Т.е. если N отрицательное суммировать нужно отрицательные числа?
Код:
write((((sqr(n)+n) div 2)*n) div n)
Так не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.07.2012, 09:50   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Stilet, не, это решение ЕЩЁ хуже.
мало того, что всё так же оно не работает для отрицательных чисел,
мало того, что это решение, как и предыдущее не работает для нуля, но в этом решении при нуле выдаётся runtime error (division by zero)

контр примеры:
Код:
n   результат
0      1
1      1
5      15
-5    -14   (  1 + 0 + (-1)+(-2)+(-3)+(-4)+(-5) = -14 )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.07.2012, 10:04   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попытка не пытка
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.07.2012, 10:19   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Может как-то можно заменить div на байтовые операции? Ну типа сдвиг или еще что-нибудь. По крайней-мере деление на 2 по-любому должно как-то так заменяться. Да и быстрей должно получаться.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 25.07.2012, 12:41   #16
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Utkin, количество символов в коде то одинаковое, хоть n div 2 хоть n shr 1, сдвигом конечно быстрее, но с учетом того что деление выполняется в программе 1 раз - какая разница то
astecenko вне форума Ответить с цитированием
Старый 25.07.2012, 13:06   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Utkin
Может как-то можно заменить div на байтовые операции? Ну типа сдвиг или еще что-нибудь. По крайней-мере деление на 2 по-любому должно как-то так заменяться. Да и быстрей должно получаться.
не-не-не! весь смысл моего вопроса в данном топике - это получение МИНИМАЛЬНОГО по длине рабочего кода. Быстрее/медленее, эффективнее, не эффективнее в данном разрезе абсолютно неважно!

ладно. думаю, что тема себя исчерпала.
Всем принявшим участиве в обсуждении большое СПАСИБО!


p.s. я с высокой долей вероятности уверен, что решения, занявшие ТОП используют какую-то недокуменнтированную возможность. По крайней мере, то, что касается Бейсика - это 100% так. Старый компилятор бейсика позволял выполнять сокращённую запись. После его замены на более новый ТОП лидер ACMP.RU - Антон Лунёв жаловался в форуме на то, что теперь решения его не проходят. и даже предлагал перезачесть все сданные работы в топ-листе с учётом нового компилятора!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.07.2012, 13:28   #18
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Кстати, вместо ord(n<1) можно использовать побитовый сдвиг, например для типа int64 конструкцию n shr 63
astecenko вне форума Ответить с цитированием
Старый 25.07.2012, 14:01   #19
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
z:=n*(abs(n)+1) div 2;
и
Код:
z:=(n*n+n) div 2;
Не одно и тоже?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 25.07.2012, 14:02   #20
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Нашёл более короткое решение! Даже короче того что в топе на сайте, но почему-то у них выдает Compilation Error. Работать будет только в Free Pascal. Суть в том что в Free Pascal для побитового сдвига можно использовать >> (аналог shr) и << (аналог shl), в итоге используя сдвиг получаем вот такое решение длиной в 109 символов :-)
Код:
var n:int64;
begin
  reset(input,'input.txt');
  rewrite(output,'output.txt');
  read(n);
  write((1+abs(n))>>1*n+n>>63)
end.
Проверял в Lazarus - работает :-)
Возможно раньше на сайте Free Pascal-евский компилятор был иначе сконфигурирован и подобное решение не вызывало ошибки.

З.Ы.: К решению подтолкнуло http://www.freepascal.org/docs-html/ref/refsu37.html

З.З.Ы.: Рано обрадовался, при делении сдвигом отриц чисел получается ерунда, так что div 2 все же придется оставить, но даже так получится решение в 111 символов, то бишь в топ попало бы

Последний раз редактировалось astecenko; 25.07.2012 в 14:18.
astecenko вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа для решения задачи из теории чисел Santogold Фриланс 10 30.04.2012 17:00
Сокращение кода. Eldrich JavaScript, Ajax 0 07.09.2011 20:01
Оптимизация и сокращение кода (if + сдвиг) Alex Cones Общие вопросы Delphi 2 06.04.2010 21:37
Оптимизация решения транспортной задачи методом "ступенек" EvKont Помощь студентам 0 26.04.2009 14:51
нахождение суммы четных чисел в массиве Ci_novice Общие вопросы C/C++ 1 23.12.2007 12:11