Оптимизация по времени и памяти

286
01 августа 2017, 17:47

Задача:
Для положительного целого числа n определим функцию f:

f(n) =  - 1 + 2 - 3 + .. + ( - 1)^n*n

Посчитать f(n) для данного целого числа n.

Написал сначала через for превысил лимит времени:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    int sum(0), n;
    cin >> n;
    for (int i(1); i <= n; ++i)
        sum += pow(-1, i)*i;
    cout << sum;
    system("pause");
    return 0;
}

Затем с рекурсией превысило ограничение по памяти:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n, sum(0), i(1);
void rek()
{
    while (i <= n)
    {
        sum += pow(-1, i)*i;
        ++i;
        rek();
    }
}
int main()
{
    cin >> n;
    rek();
    cout << sum;
    system("pause");
    return 0;
}

Помогите оптимизировать код (на тесте n = 1000000000).

Answer 1

А просто подумать? Что каждая пара дает число 1?

Так что в результате получается

(-1 + (-1)^n + 2*n*(-1)^n)/4

Ну, а код

int main()
{
    int n;
    cin >> n;
    cout << ((2*n+1)*((n%2) ? -1 : 1) - 1)/4 << endl;
}
READ ALSO
AddressSanitizer Stack Buffer Overflow

AddressSanitizer Stack Buffer Overflow

Есть следующий код

396
Как получить язык текущей локали

Как получить язык текущей локали

Есть ли кроссплатформенный вариант получения языка из текущей локали пользователя/системы(Не Си локали, а например ту, что в $LANG)? В Boost ничего...

293
Вопрос по символу ENTER

Вопрос по символу ENTER

Пишу программу с использованием математических операторов по книгеВозник вопрос (который возможно был уже задан): как правильно в условии...

323