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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2013, 10:44   #1
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию Оптимизация (сокращение) кода решения задачи #46 c acmp.ru - вывод числа E с заданной точностью

День Добрый.

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

Собственно сабж : Число Е (acmp.ru)

Число E
(Время: 1 сек. Память: 16 Мб Сложность: 10%)

Выведите в выходной файл округленное до n знаков после десятичной точки число E. Число Е, округленное до 25 знаков после десятичной точки, равно 2.7182818284590452353602875.

Входные данные

Входной файл INPUT.TXT содержит целое число n (0 ≤ n ≤ 25).

Выходные данные

В выходной файл OUTPUT.TXT выведите ответ на задачу.

Пример

Код:
INPUT.TXT	    OUTPUT.TXT
0	             3
25	             2.7182818284590452353602875
13	             2.7182818284590
Мысли по этому поводу :
Не глядя на ограничения, можно предположить, что
Код:
Write (2.7182818284590452353602875 : 0 : n)
Сработает на ура. НО есть одна проблема и имя ей точность. В паскале наибольшая точность - 16 знаков после запятой.

На ум может прийти вариант вывести первые 16 знаков, а затем дописать остальные, НО при выводе
Код:
Write (2.7182818284590452353602875 : 0 : n)
, где N > 16 в конце появляется 0, и убрать его оттуда - слишком накладно.

Можно сразу химичить со строкой (именно на таком варианте я и остановился) :
Код:
var
        s : string;
        n : Byte;

begin
        Reset (input, 'input.txt');
        Assign (output, 'output.txt');

        Read (n);
        s := '2.7182818284590452353602875 ';
        Inc (s[n+2], Ord(s[n+3] > '4'));
        if n = 0 then
                Write (3)
        else
                Write (Copy (s, 1, n+2))
end.
190 символов.
В топе красуются решения с 149, 162, 165 символов)
Не подскажете как можно это сократить?

(была идея убирающая 1 символ), но при тесте 0 валится :
Код:
var
        s : string;
        n : Byte;

begin
        Reset (input, 'input.txt');
        Assign (output, 'output.txt');

        Read (n);
        s := '7182818284590452353602875 ';
        Inc (s[n], Ord(s[n+1] > '4'));
        if n = 0 then
                Write (3)
        else
                Write ('2.' + Copy (s, 1, n))
end.

Последний раз редактировалось Poma][a; 30.06.2013 в 10:48.
Poma][a вне форума Ответить с цитированием
Старый 30.06.2013, 15:25   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

186 - пока все, что смог:
Код:
var
  n: Byte;

begin
  Reset(input, 'input.txt');
  Assign(output, 'output.txt');
  Read(n);
  inc(n, 2 - ord(n = 0));
  Write(copy('2.7182818284590452353602875', 1, n - 1) + copy('3.7283828385690552454603985', n, 1))
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.06.2013, 15:27   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Код:
Write(copy('2.7182818284590452353602875', 1, n - 1) + copy('3.7283828385690552454603985', n, 1))
Гениально! Ручками просчитать последние цифры и уйти от Inc я не додумался.
Poma][a вне форума Ответить с цитированием
Старый 30.06.2013, 16:21   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Гениально было бы попасть в топ
179:
Код:
var
  n: Byte;

begin
  Reset(input, 'input.txt');
  Assign(output, 'output.txt');
  Read(n);
  inc(n, 2 - ord(n = 0));
  Write(copy('2.7182818284590452353602875', 1, n - 1) + '3.7283828385690552454603985'[n])
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.06.2013, 16:54   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

179 говорите? Можно сказать, что Вы уже в ТОПе.

А знаете что нижняя строка ТОПа и есть 179 И на acmp процветает еще вот такой идиотизм : Если Ваша длина кода = длине кода человека X. и человек X сдал задачу раньше Вас и время прохождения тестов человека Х > Вашего времени, то Вы займете место человека X и табличка сдвинется..
Вот такое кино..

А если Вы еще N раз пересдадите задачку, то есть большой шанс попадания в топ
Poma][a вне форума Ответить с цитированием
Старый 30.06.2013, 17:02   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Я убил acmp тыц
Poma][a вне форума Ответить с цитированием
Старый 30.06.2013, 17:06   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,213
По умолчанию

А разве корректно сравнивать размер, тем более, что решается задача на разных языках?
Arigato вне форума Ответить с цитированием
Старый 30.06.2013, 17:09   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
А разве корректно сравнивать размер, тем более, что решается задача на разных языках?
Нет, конечно же
Неплохо бы ввести весовые коэффициенты и для занимаемой памяти и времени выполнения (у меня 1 задача отрабатывает быстрее всех и занимает меньше всех памяти, но занимает 2 место из-за длины).
Вряд ли администраторы будут менять систему.

Цитата:
Сообщение от Poma][a Посмотреть сообщение
179 говорите? Можно сказать, что Вы уже в ТОПе.
Да, видел. Нужно выбросить 1 символ - тогда 100% в топе
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.06.2013, 17:10   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
А разве корректно сравнивать размер, тем более, что решается задача на разных языках?
Это же acmp И вопрос корректно - некорректно тут не стоит. Тут спрашивается : "ГДЕ лишние байты?"!

Цитата:
Неплохо бы ввести весовые коэффициенты и для занимаемой памяти и времени выполнения
Не-не-не! У меня одна задача в ТОПе держится только на 1 байте. И если его просекут, то полечу я с "Олимпа"


Кстати, есть идея, только не знаю прокатит или нет.. (боюсь что нет)
Если во Write вместо строки пихнуть IntToStr'ом шестнадцатиричное число? (будет '2.' + IntToStr($<число>))
Вот только Windows'овский калькулятор больше 8 байтовых чисел не переводит.. Ручками считать - лень..

Последний раз редактировалось Poma][a; 30.06.2013 в 17:15.
Poma][a вне форума Ответить с цитированием
Старый 30.06.2013, 17:13   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,213
По умолчанию

А пробелы они не считают?
Arigato вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация (сокращение) кода решения задачи #2 c acmp.ru - нахождение суммы целых чисел от 1 до N Serge_Bliznykov Помощь студентам 31 23.08.2014 22:35
Оптимизация кода задачи three_cats Общие вопросы C/C++ 7 28.09.2012 15:13
Написать программу, которая вычисляет приближенное значение числа e с заданной точностью quade1992 Паскаль, Turbo Pascal, PascalABC.NET 3 08.11.2011 15:10
Вычисление числа e, Pi с заданной точностью MrakSPb Общие вопросы C/C++ 3 12.05.2010 12:51
Оптимизация и сокращение кода (if + сдвиг) Alex Cones Общие вопросы Delphi 2 06.04.2010 21:37