Форум программистов, компьютерный форум CyberForum.ru

Вычислить сумму ряда - C++

Восстановить пароль Регистрация
 
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
25.07.2013, 14:25     Вычислить сумму ряда #1
По заданным числам n и a вычислить значение суммы: http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i=1}^{n}i*a^i


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cmath>
#define ll long long
 
inline ll binpow(ll x, ll n) {
    ll res = 1;
    while (n) {
        if (n & 1)res *= x;
        x *= x;
        n >>= 1;
    }
    return res;
}
 
int main() {
    ll n, a, s = 0;
    std::cin >> n >> a;
    for (ll i = 1; i <= n; i++) {
        s += i * binpow(a, i);
    }
    std::cout << abs(s) << std::endl;
    return 0;
}
вроде правильно, а проходит на 53%, где я туплю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2013, 14:25     Вычислить сумму ряда
Посмотрите здесь:

Вычислить сумму ряда C++
C++ Вычислить сумму ряда
Вычислить сумму ряда C++
C++ Вычислить сумму ряда.
C++ Вычислить сумму ряда
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fintt
 Аватар для Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
25.07.2013, 14:28     Вычислить сумму ряда #2
Извиняюсь я написал не то, я не так понял.
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
25.07.2013, 14:37  [ТС]     Вычислить сумму ряда #3
Цитата Сообщение от Fintt Посмотреть сообщение
мб &&?


Добавлено через 8 минут

Не по теме:

где Thinker, когда он нужен

Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
25.07.2013, 15:38     Вычислить сумму ряда #4
Немного подковырял код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<cmath>
double binpow(double x, int n) {
    while (--n) 
        x *= x;
    return x;
}
int main() {
    double a, s = 0;
    int n;
    std::cin >> n >> a;
    for (int i = 1; i <= n; i++) 
        s += i * binpow(a, i);
    std::cout << abs(s) << std::endl;
    system("pause");
    return 0;
}
Хотя я бы рекомендовал информировать пользователя какие конкретно переменные необходимо ввести.
Надеюсь нигде не ошибся. Вопросы?

Добавлено через 10 минут
n >>= 1;
Это как я понимаю должен быть декремент?
Если я не ошибаюсь побитовый сдвиг вправо это деление на два. Вы уверены, что он здесь нужен или это просто я не понимаю ваш алгоритм?

Добавлено через 2 минуты
C++
1
(n & 1)
А если n = 3 (двоичный 011)?
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
25.07.2013, 16:30  [ТС]     Вычислить сумму ряда #5
Цитата Сообщение от Ilot Посмотреть сообщение
Хотя я бы рекомендовал информировать пользователя какие конкретно переменные необходимо ввести.
Цитата Сообщение от Belfegor Посмотреть сообщение
проходит на 53%

Не по теме:

это намекает о том, что это олимпиадная задача


Цитата Сообщение от Ilot Посмотреть сообщение
Вы уверены, что он здесь нужен
да
Цитата Сообщение от Ilot Посмотреть сообщение
я не понимаю ваш алгоритм
да

Ваше решение неверно.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
25.07.2013, 16:36     Вычислить сумму ряда #6
Эмм... ради интереса в чем ошибка?
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
25.07.2013, 16:44  [ТС]     Вычислить сумму ряда #7
Цитата Сообщение от Ilot Посмотреть сообщение
Эмм... ради интереса в чем ошибка?
http://ideone.com/Uda7EZ

Не по теме:

n--a----s
3--3----264(должно быть 102)
4--4----262948(должно быть 1252)

Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
25.07.2013, 16:51     Вычислить сумму ряда #8
здесь же правильные результаты выдает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cmath>
#define ll long long
 
inline ll binpow(ll x, ll n) {
    ll res = 1;
    while (n) {
        if (n & 1)res *= x;
        x *= x;
        n >>= 1;
    }
    return res;
}
 
int main() {
    ll n, a, s = 0;
    std::cin >> n >> a;
    for (ll i = 1; i <= n; i++) {
        s += i * binpow(a, i);
    }
    long k=s;
    std::cout << abs(k) << std::endl;
    system("pause");
    return 0;
}
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
25.07.2013, 16:53     Вычислить сумму ряда #9
А... ну делов-то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include<cmath>
double binpow(double x, int n) {
    double res = x;
    while (--n) 
        res *= x;
    return res;
}
int main() {
    double a, s = 0;
    int n;
    std::cin >> n >> a;
    for (int i = 1; i <= n; i++) 
        s += i * binpow(a, i);
    std::cout << abs(s) << std::endl;
    system("pause");
    return 0;
}
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
25.07.2013, 17:05     Вычислить сумму ряда #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
    int a, n, sum = 0, x = 1;
 
    cin >> n >> a;
    for ( int i = 1; i <= n; ++i )
        sum += ( x *= a ) * i;
    cout << sum << endl;
 
    return 0;
}
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
25.07.2013, 17:19  [ТС]     Вычислить сумму ряда #11
Цитата Сообщение от Valentina Посмотреть сообщение
здесь же правильные результаты выдает
Цитата Сообщение от Belfegor Посмотреть сообщение
проходит на 53%
ya_noob, тоже самое...
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
25.07.2013, 17:32     Вычислить сумму ряда #12
Цитата Сообщение от Belfegor Посмотреть сообщение
По заданным числам n и a вычислить значение суммы
а какие диапазоны допустимых значений для n и a?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
25.07.2013, 17:55     Вычислить сумму ряда #13
А ряд таки легко суммируется: производная от геометрической прогрессии. выхожу с телефона формулу написать сложно, но думаю для вас это не составит труда. удачи
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
25.07.2013, 18:17  [ТС]     Вычислить сумму ряда #14
Цитата Сообщение от ya_noob Посмотреть сообщение
а какие диапазоны допустимых значений для n и a?
Два натуральных числа n и a.
сумма не превышает 10^18
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
25.07.2013, 18:39     Вычислить сумму ряда #15
Цитата Сообщение от Belfegor Посмотреть сообщение
Два натуральных числа n и a.
сумма не превышает 10^18
тут надо формулу для суммы ряда найти, а иначе вы по времени не влезете. попробуйте такой тест: 950000000 1
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
25.07.2013, 19:26     Вычислить сумму ряда #16
Belfegor, чтобы найти степень a^i, где нужны все степени от a^1 до a^i, можно провернуть за O(i), а ты вкрутил никому не нужный бинпоиск, теперь сложность накручивается на логарифм за каждую итерацию. К примеру такой код свалился лишь на 1 тесте по времени:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    #include <iostream>
 
    int main()
    {
        unsigned __int64 result = 0, power;
        int n, a;
        std::cin >> n >> a;
        power = 1;
        for (int i = 1; i<=n; ++i)
        {
            power *= a;
            result += i * power;
        }
        std::cout << result << std::endl;
    }
Добавлено через 19 минут
И вообще, долго работать программа может только если a = 1, поэтому нужно просто заифить этот случай и найти ответ при помощи формулы суммы арифметической прогрессии. Этот код берет 100%:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
 {
    unsigned __int64 result = 0, power;
    unsigned __int64 n, a;
    std::cin >> n >> a;
    power = 1;
    if (a == 1)
    {
        std::cout << unsigned __int64(((n/2.0 + 0.5)*n)) << std::endl;
        return 0;
    }
    for (unsigned __int64 i = 1; i<=n; ++i)
    {
        power *= a;
        result += i * power;
    }
    std::cout << result << std::endl;
 }
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.07.2013, 20:31     Вычислить сумму ряда #17
используя технику производящих функций, получаем (при a != 1):
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i=1}^nia^i = \frac{a(na(a-1)a^{n-1} - a^{n}+1)}{(a-1)^2}

при a = 1 отдельный случай:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i=1}^nia^i = \frac{n(n+1)}{2}

используя бинарное возведение в степень, получаем алгоритм логарифмической сложности.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 08:08     Вычислить сумму ряда
Еще ссылки по теме:

C++ Вычислить сумму ряда
C++ Вычислить сумму ряда
Вычислить сумму ряда C++

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
26.07.2013, 08:08     Вычислить сумму ряда #18
Thinker, я об этом и говорил
Yandex
Объявления
26.07.2013, 08:08     Вычислить сумму ряда
Ответ Создать тему
Опции темы

Текущее время: 17:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru