Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Vooopl
0 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 2
1

Оптимизация программы по быстродействию

22.04.2017, 11:35. Просмотров 255. Ответов 1

Помогите плиз, очень нужна помощь, заранее спасибо!
Что убрать, что изменить?!

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
//Вычислить выражение s=1^2+3^2+5^2 +...+n^2, n - нечетное число
var
  i, n: integer;
  s: real;
 
begin
  readln(n);
  s := 0;
  for i := 1 to n do
    if i mod 2 <> 0 then 
      s := s + i * i;
  writeln('s=', s);
end.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2017, 11:35
Ответы с готовыми решениями:

Последовательность Фиббоначи. Оптимизация программы
Я написал программу, благодаря которой можно вычислить, почти, все числа фиббоначи. program Fib; ...

Оптимизация программы
Задание: Решите задачу, используя только элементарные конструкции (последовательность, ветвления,...

Оптимизация программы
Здравствуйте! Решил я изучить паскаль(причины и история в спойлере:)) Отучившись пол года в ЛЭТИ и...

Оптимизация программы
program r03rjiwdfe; const Q = 5; var c: integer; i : char; mas : array of integer; ...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...

1
Cyborg Drone
Модератор
5840 / 3430 / 2545
Регистрация: 17.08.2012
Сообщений: 10,997
22.04.2017, 22:33 2
Математика - это... Это святое!

Цикл не нужен.

Известно, что сумма первых k натуральных нечётных чисел равна

http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\sum_{i=1}^{k}(2i-1)^2=\frac{k\left( 4k^2-1\right)}{3}<br />

Вычисляем количество чисел k на основе Вашего n

http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
2k-1=n\,\Rightarrow \,k=\frac{n+1}{2}<br />

Вообще говоря, нужно делать проверку ввода, просто табу недостаточно. Ну да ладно, программа в приведённом Вами "беззащитном" и безинтерфейсном стиле:
Pascal
1
2
3
4
5
6
var n: longint;
begin
  readln(n);
  n := (n + 1) shr 1; //n := (n + 1) div 2;
  writeln('S = ', n * (4 * n * n - 1) div 3)
end.
Если вдруг окажется, что нужно вычислить сумму квадратов n первых натуральных нечётных чисел, то удалите строку 4.

Добавлено через 8 часов 27 минут
Существенное дополнение:

Задачка эта крутилась в моей голове в фоновом режиме... И вот что я подумал. Конечно же, при n, больше какой-то величины, в программе возникнет целочисленное переполнение. Но в моей программе, при прочих равных условиях, оно возникнет при n, в 3 раза меньших, чем в Вашей программе с циклом. Действительно, в моей программе сначала требуется получить число, в 3 раза больше искомого, а уж потом делить его на 3. В программе с циклом никаких чисел, больших искомого, не получается по определению.

Попробуем сделать так, чтобы программы сравнялись по диапазону допустимых входных значений. Для этого сделаем так, чтобы не получалось число, в 3 раза большее искомого. Конечно, программа замедлится, но несущественно. Будем считать это платой за расширение диапазона входных значений. И вот что вынесло из моего фонового режима:

А давайте-ка какой-нибудь множитель в числителе разделим на 3 без остатка, а после домножим то, что получится, на то, что осталось.

Для начала умножим числитель и знаменатель на 2 (это для лёгкости понимания, сейчас поймёте), и избавимся от разности квадратов:

http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\frac{k\left( 4k^2-1\right)}{3}=\frac{2k\left(2k-1)(2k+1)}{2\cdot 3}<br />

И что имеем с гуся? А то, что 2k-1, 2k и 2k+1 - это три идущих подряд натуральных числа, и одно из них просто обязано делиться на 3 без остатка. Кроме того, если 2k делится на 3, то и k делится на 3. Получается, что одно из чисел: k, 2k-1 или 2k+1, обязательно делится на 3 без остатка. Легко показать, что в зависимости от остатка деления k на 3 будет делиться на 3 без остатка следующее число:

k mod 3Делится на 3 без остатка
0k
12k+1
22k-1

Тогда программа может выглядеть, например, так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var n, nn: longint;
begin
  readln(n);
  n := (n + 1) shr 1; //n := (n + 1) div 2;
  nn := n shl 1; //nn := 2 * n;
  case n mod 3 of
    0: n := n div 3 * (nn - 1) * (nn + 1);
    1: n := (nn + 1) div 3 * n * (nn - 1)
    else n := (nn - 1) div 3 * (nn + 1) * n
  end;
  writeln('S = ', n)
end.
Для скорости 2k заранее вычисляется с помощью сдвига. Сдвиги существенно быстрее, чем умножение и деление, тем более, на степени двойки.
3
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2017, 22:33

по быстродействию
всем привет. вообщем делаю прогу с вычислениями и отрисовкой в реальном времени, так что к ПО...

Вопрос по быстродействию
Добрый вечер, если использовать напрямую библиотеки HAL (работаю на STM32F3), то это сильно...

Выбрать МК по быстродействию
Подскажите, какой применить контроллер: нужен в минимальном корпусе, способный выдавать импульсы...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru