Для вас нужно подсчитать сумму S(n) = 1 - 2 + 3

Для вас нужно подсчитать сумму S(n) = 1 - 2 + 3 - 4 + + (-1)n+1 *n. Напишите программку, которая обретает ответ за малое время и употребляет меньший объем оперативной памяти.
Входные данные: одно целое число n (1 n 109)
Выходные данные: ответ S(n)

Задать свой вопрос
1 ответ
Если следовать алгоритму вычисления, представленному в формуле, то программа будет такая:

var
  n,i,s: shortint ;
begin
  write ('N=');
  readln (n);
  s:=0;
  for i:=1 to n do 
    if i mod 2 =0 
      then s:=s-i
      else s:=s+i;
  print (s)
end.

Если же поглядеть на формулу пристально и выявить закономерность, то можно увидеть, что 

1) вычитаются только четные числа. И после каждого вычитания итог равен ровно половине вычитаемого числа (со знаком минус)
2) прибавляются только нечетные числа И прибавление идет вослед за вычитанием (кроме 1), т.е. можно к результату заключительного вычитания (см.п.1) просто прибавить N.

Также учитываем, что целые числа занимают меньше памяти, чем вещественные, поэтому для программки используем самый маленький целый тип с отрицательными значениями shortint (от -128 до 127, что в данном случае нас полностью устраивает).

Помним, что значение переменной целого типа не может быть результатом деления, потому заместо обыденного дробления используем дробление нацело (N div 2)

Итак:При нечетном N итог = -N div 2,
При четном N: (так как у нас целочисленное разделенье, то N div 2 будет одинаково (N-1) div 2) итог будет = -(N div 2) + N либо N-(N div 2)
Т.е. вся программка сведена всего к двум операциям по различным веткам условного оператора, что сделает ее быстрее и экономичнее. К тому же не надобно выделять память для переменной-счетчика.

var
  n,s: shortint;
begin
  write ('N=');
  readln (n);
  if n mod 2 =0
    then s:=-n div 2
    else s:=n-(n div 2);
  print (s)
end.

Можно увидеть и иную закономерность, что каждое сложение и идущее за ним вычитание дают одинаковый итог с различными знаками, т.е. при четном N также s=-N div 2, а при нечетном -  s=N div 2+1. Но великий разницы это не даст.
Сашок Валенюк
Спасибо)
Ромка
Хм... до такого, не зная, и не додумаешься. Спасибо)
Павел Самкотрясов
Не доводилось. Я вообщем не профи совершенно никак
Воспресов Толя
спасибо большое)
, оставишь ответ?
Имя:*
E-Mail:


Последние вопросы

Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт