Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Ghost
174 / 174 / 40
Регистрация: 16.09.2012
Сообщений: 526
1

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

25.07.2013, 14:25. Показов 1266. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
По заданным числам n и a вычислить значение суммы: https://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%, где я туплю?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2013, 14:25
Ответы с готовыми решениями:

Вычислить сумму ряда. Где-то напутал знаки или формула ряда не правильная. Посмотрите свежим взглядом.
Привет! Пишу простую контрольную, не могу понять, то ли я где-то со знаками туплю, то ли формула...

Вычислить сумму четных и сумму нечетных чисел натурального ряда от 1 до n
18 задача 1 лаба После удара о поверхность Земли мяч движется вертикально вверх со скорость 15...

Вычислить сумму четных и сумму нечетных чисел натурального ряда от 1 до N
Вычислить сумму четных и сумму нечетных чисел натурального ряда от 1 до N. Не могу найти где...

Вычислить сумму ряда
Дaно нaтуpaльно число А и целое число N (N&gt;0). Используя один цикл, найти выражение...

17
10 / 10 / 2
Регистрация: 13.02.2012
Сообщений: 94
25.07.2013, 14:28 2
Извиняюсь я написал не то, я не так понял.
0
Ghost
174 / 174 / 40
Регистрация: 16.09.2012
Сообщений: 526
25.07.2013, 14:37  [ТС] 3
Цитата Сообщение от Fintt Посмотреть сообщение
мб &&?


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

Не по теме:

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

0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
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)?
0
Ghost
174 / 174 / 40
Регистрация: 16.09.2012
Сообщений: 526
25.07.2013, 16:30  [ТС] 5
Цитата Сообщение от Ilot Посмотреть сообщение
Хотя я бы рекомендовал информировать пользователя какие конкретно переменные необходимо ввести.
Цитата Сообщение от Belfegor Посмотреть сообщение
проходит на 53%

Не по теме:

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


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

Ваше решение неверно.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
25.07.2013, 16:36 6
Эмм... ради интереса в чем ошибка?
0
Ghost
174 / 174 / 40
Регистрация: 16.09.2012
Сообщений: 526
25.07.2013, 16:44  [ТС] 7
Цитата Сообщение от Ilot Посмотреть сообщение
Эмм... ради интереса в чем ошибка?
http://ideone.com/Uda7EZ

Не по теме:

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

0
70 / 70 / 13
Регистрация: 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;
}
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
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;
}
0
_
317 / 151 / 27
Регистрация: 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;
}
0
Ghost
174 / 174 / 40
Регистрация: 16.09.2012
Сообщений: 526
25.07.2013, 17:19  [ТС] 11
Цитата Сообщение от Valentina Посмотреть сообщение
здесь же правильные результаты выдает
Цитата Сообщение от Belfegor Посмотреть сообщение
проходит на 53%
ya_noob, тоже самое...
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
25.07.2013, 17:32 12
Цитата Сообщение от Belfegor Посмотреть сообщение
По заданным числам n и a вычислить значение суммы
а какие диапазоны допустимых значений для n и a?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
25.07.2013, 17:55 13
А ряд таки легко суммируется: производная от геометрической прогрессии. выхожу с телефона формулу написать сложно, но думаю для вас это не составит труда. удачи
0
Ghost
174 / 174 / 40
Регистрация: 16.09.2012
Сообщений: 526
25.07.2013, 18:17  [ТС] 14
Цитата Сообщение от ya_noob Посмотреть сообщение
а какие диапазоны допустимых значений для n и a?
Два натуральных числа n и a.
сумма не превышает 10^18
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
25.07.2013, 18:39 15
Цитата Сообщение от Belfegor Посмотреть сообщение
Два натуральных числа n и a.
сумма не превышает 10^18
тут надо формулу для суммы ряда найти, а иначе вы по времени не влезете. попробуйте такой тест: 950000000 1
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
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;
 }
2
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.07.2013, 20:31 17
используя технику производящих функций, получаем (при a != 1):
https://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 отдельный случай:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{i=1}^nia^i = \frac{n(n+1)}{2}

используя бинарное возведение в степень, получаем алгоритм логарифмической сложности.
2
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
26.07.2013, 08:08 18
Thinker, я об этом и говорил
0
26.07.2013, 08:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2013, 08:08
Помогаю со студенческими работами здесь

Вычислить сумму ряда
Помогите,пожалуйста,напишите прогу на C++ Даны действительное число a, натуральное число n. ...

Вычислить сумму ряда
Помогите составить программу для этого задания &quot;Программирование алгоритмов циклической структуры...

Вычислить сумму ряда
Дано натуральное число N. Вычислить:

Вычислить сумму ряда
Добрый вечер. Ребята, помогите пожалуйста записать формулу в С++. Программа сама то написана, а вот...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru