Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
sanny11
0 / 0 / 0
Регистрация: 09.12.2016
Сообщений: 3
1

Программа вычисления суммы 1 + 1/2 + 1/3 + … + 1/n для заданного числа n

06.06.2017, 17:42. Просмотров 2084. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Помогите пожалуйста разобраться вот с такой проблемой.
Разбираюсь с простенькими заданиями, на очереди вот это:
Написать программу вычисления суммы 1 + 1/2 + 1/3 + … + 1/n для заданного числа n. Результат представить в виду несократимой дроби p/q (p, q – натуральные).
Имеется следующий код:

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
26
27
28
29
30
31
32
#include "stdafx.h"
#include <iostream>
using namespace std;
void sum(double n, int &p, int &q);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    double n = -1;
    int p = 1, q = 1;
 
    while (n<0 || (n - int(n)) != 0)
    {
        cout << "Введите целое положительное число: " << endl;
        cin >> n;
    }
 
    sum(n, p, q);
    cout << "\nПолученная дробь: ";
    cout << p << "/" << q << endl << endl;
    system("pause");
}
 
 
void sum(double n, int &p, int &q)
{
    for (int i = 2; i <= n; i++)
    {
        p = p*i + q;
        q = i*q;
    }
}


Проблема в следующем: при вводе больших чисел, например больше 10-ти, программа работает не очень, откуда-то появляются отрицательные значения и я совершенно не знаю как заставить программу работать корректно, потому что я новичок. Это длится уже больше недели, подскажите, в чём ошибка?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2017, 17:42
Ответы с готовыми решениями:

Для заданного числа N составьте программу вычисления суммы S=1+1/2+1/3+1/4+…+1/N, где N – натуральное число
Нихрена не получается #include &lt;iostream&gt; using namespace std; int main() { int n; ...

Составить программу вычисления суммы всех членов последовательности не меньших заданного числа
школьная программа, очень легкая, но не могу понять почему не работает (решение выводит не...

Составить программу для вычисления суммы заданного ряда
Составить программу для вычисления суммы заданного ряда для указанного значения аргумента х, если...

Функция вычисления суммы ряда для заданного аргумента
Помогите решить задачу. Написать функцию вычисления суммы ряда для заданного аргумента с...

Для заданного варианта написать функцию вычисления суммы ряда:
ряд 1+ x ln3 + (x ln3)2/2! +...+(x ln 3)n/n! функция 3^x пояснение:· ...

6
Renji
2602 / 1788 / 536
Регистрация: 05.06.2014
Сообщений: 5,185
06.06.2017, 20:35 2
Цитата Сообщение от sanny11 Посмотреть сообщение
Проблема в следующем: при вводе больших чисел, например больше 10-ти, программа работает не очень, откуда-то появляются отрицательные значения и я совершенно не знаю как заставить программу работать корректно, потому что я новичок. Это длится уже больше недели, подскажите, в чём ошибка?
В том что числа растут по факториалу и прилетает арифметическое переполнение. Возможные варианты решения:
1) После каждой итерации цикла сокращать дробь, дабы числитель со знаменателем не улетали в небеса.
2) Пилить длинную арифметику. Именно пилить, из коробки она не поддерживается, а решение с готовой левой библиотекой у вас вряд ли примут.
0
sanny11
0 / 0 / 0
Регистрация: 09.12.2016
Сообщений: 3
06.06.2017, 20:47  [ТС] 3
Спасибо!
0
Renji
2602 / 1788 / 536
Регистрация: 05.06.2014
Сообщений: 5,185
06.06.2017, 20:50 4
Цитата Сообщение от sanny11 Посмотреть сообщение
Вы не подскажете, как соорудить сокращение дроби после каждой итерации?
Прочитав школьный учебник арифметики? Ищите у p и q общие делители, если находите - делите и то, и то на этот самый делитель. И так пока делители не кончатся.
0
sanny11
0 / 0 / 0
Регистрация: 09.12.2016
Сообщений: 3
06.06.2017, 20:50  [ТС] 5
Это я понимаю, конечно же. Не понимаю, как соорудить код в программе. Чтож, спасибо Вам.
0
Catstail
Модератор
25532 / 13131 / 2466
Регистрация: 12.02.2012
Сообщений: 21,493
06.06.2017, 21:05 6
Зачем используешь double, если нужна целая арифметика?

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
26
27
28
29
30
31
32
33
34
35
36
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int gcd(int a, int b)
{
    int k;
    if (a < b) return gcd(b,a);
    k=(a % b);
    if (k==0) return b;
    return gcd(b,k);
}    
 
void sumRat(int p1, int q1, int p2, int q2, int &rp, int &rq)
{
     int num,den,g;
     num=p1*q2+p2*q1;
     den=q1*q2;
     g=gcd(num,den);
     rp=num/g;
     rq=den/g;
}     
 
int main(int argc, char *argv[])
{
    int rp=0,rq=1,sp,sq;
    int i,n;
    for (i=2; i<=15; i++)
        sumRat(1,i,rp,rq,rp,rq);
    
    cout << rp <<"/" << rq << endl;   
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Выдает 835397/360360 - верно

Добавлено через 8 минут
Опс... Не заметил, что начинать надо с единицы:

C++
1
         for (i=1; i<=15; i++) // строка 29
0
Fixer_84
1416 / 894 / 795
Регистрация: 30.04.2016
Сообщений: 3,058
06.06.2017, 22:21 7
sanny11, здравствуйте! Вот мой вариант. Вроде, все получилось.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <tuple>
#include <windows.h> //Шрифт консоли - Lucida Console
 
using namespace std;
 
int GCD(int n, int m)
{
    while (n - m != 0)
    {
        if (n > m)
            n -= m;
        else
            m -= n;
    }
    return n;
}
 
tuple<int, int> Sum(int a, int b, int c, int d)
{
    int k, m, n, p;
    k = (b * d) / GCD(b, d);
    m = a * (k / b) + c * (k / d);
    n = k;
    p = GCD(m, n);
    return make_tuple(m / p, n / p);
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int N;
    int x, y;
    cout << "Введите количество слагаемых:" << endl;
    cout << "N = ";
    cin >> N;
    x = y = 1;
    for (int i = 2; i < N + 1; i++)
    {
        tie(x, y) = Sum(x, y, 1, i);
    }
    cout << "Ответ: " << x << "/" << y << endl;
    system("pause");
    return 0;
}
0
06.06.2017, 22:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2017, 22:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Для заданного числа N составьте программу вычисления суммы
Для заданного числа N составьте программу вычисления суммы S=1+1/2+1/3+1/4+…+1/N, где N –...

Для заданного числа N составьте программу вычисления суммы S=1+1/2-1/3+1/4-1/5+..+1/n
Здравствуйте! помогите пожалуйста решить задачу,3 разными способами,3 разных оператора ветвления: ...

Написать программу вычисления суммы 1+1/2+1/3+.+1/n для заданного числа n
Написать программу вычисления суммы 1+1/2+1/3+...+1/n для заданного числа n. Результат представить...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.