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

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

06.06.2017, 17:42. Просмотров 462. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2017, 17:42
Ответы с готовыми решениями:

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

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

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

Программа для вычисления суммы
S=1+3+5+7+ ., всего n слагаемых; n вводится с клавиатуры. Вычислить суму.

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

6
Renji
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,472
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
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,472
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
Модератор
23575 / 11676 / 2043
Регистрация: 12.02.2012
Сообщений: 19,049
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
1038 / 653 / 648
Регистрация: 30.04.2016
Сообщений: 2,209
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2017, 22:21

Программа для вычисления суммы ряда
Нужно написать программу для вычисления суммы ряда. Формулы надо переписывать...

Программа для вычисления суммы четных чисел от 0 до 100
Не работает программа для вычисления суммы всех четных чисел от 0 до 100....

Программа для вычисления суммы чисел по заданной формуле
Помогите пожалуйста написать программу для расчета Задано натуральное n. ...


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

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

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