Задать вопрос
9 апреля, 10:53

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

Входные данные: одно целое число n (1 ≤ n ≤ 109)

Выходные данные: ответ S (n)

+2
Ответы (1)
  1. 9 апреля, 11:31
    0
    Если следовать алгоритму вычисления, представленному в формуле, то программа будет такая:

    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. Но большой разницы это не даст.
Знаете ответ?
Сомневаетесь в ответе?
Найдите правильный ответ на вопрос ✅ «Вам необходимо подсчитать сумму S (n) = 1 - 2 + 3 - 4 + ... + (-1) n+1 * n. Напишите программу, которая находит ответ за минимальное время ...» по предмету 📘 Информатика, а если вы сомневаетесь в правильности ответов или ответ отсутствует, то попробуйте воспользоваться умным поиском на сайте и найти ответы на похожие вопросы.
Смотреть другие ответы
Похожие вопросы по информатике
Уровень B. Задача M. Две одинаковые цифры рядом Напишите программу, которая определяет, верно ли, что введённое число содержит две одинаковых цифры, стоящие рядом (как, например, 221). Входные данные Входная строка содержит одно натуральное число.
Ответы (1)
Помогите решить! 1))) Вводятся 4 числа: a, b, c и d. Выведите все числа на отрезке от a до b, дающие остаток c при делении на d Входные данные 1 4 1 2 выходные данные 1 3 Входные данный 1 5 0 4 выходные данные 4 2))) Выведите все числа на отрезке от
Ответы (1)
Входные данные Вводится натуральное число N, которое не превосходит 30. Выходные данные Вычислите 1+2+22+23+ ...+2 N. Примеры входные данные 1 выходные данные 3 входные данные 4 выходные данные 31
Ответы (1)
Выведите все натуральные делители числа x в порядке возрастания (включая 1 и само число). Входные данные Вводится натуральное число x Выходные данные Выведите все делители числа x Примеры входные данные 7 выходные данные 1 7 входные данные 21
Ответы (1)
Напишите программу, которая переводит переданное её целое число (возможно, отрицательное) в двоичный код. Используйте процедуру входные данные 5 выходные данные 101 входные данные -14 выходные данные -1110
Ответы (1)