0 / 0 / 0
Регистрация: 09.12.2016
Сообщений: 3
1

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

06.06.2017, 17:42. Показов 5413. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2017, 17:42
Ответы с готовыми решениями:

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

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

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

Написать программу вычисления суммы p/q=1-1/2+1/3-...+((-1)^(n+1))/n для заданного числа n.
Написать программу вычисления суммы p/q=1-1/2+1/3-...+((-1)^(n+1))/n для заданного числа n. Дробь...

6
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
06.06.2017, 20:35 2
Цитата Сообщение от sanny11 Посмотреть сообщение
Проблема в следующем: при вводе больших чисел, например больше 10-ти, программа работает не очень, откуда-то появляются отрицательные значения и я совершенно не знаю как заставить программу работать корректно, потому что я новичок. Это длится уже больше недели, подскажите, в чём ошибка?
В том что числа растут по факториалу и прилетает арифметическое переполнение. Возможные варианты решения:
1) После каждой итерации цикла сокращать дробь, дабы числитель со знаменателем не улетали в небеса.
2) Пилить длинную арифметику. Именно пилить, из коробки она не поддерживается, а решение с готовой левой библиотекой у вас вряд ли примут.
0
0 / 0 / 0
Регистрация: 09.12.2016
Сообщений: 3
06.06.2017, 20:47  [ТС] 3
Спасибо!
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
06.06.2017, 20:50 4
Цитата Сообщение от sanny11 Посмотреть сообщение
Вы не подскажете, как соорудить сокращение дроби после каждой итерации?
Прочитав школьный учебник арифметики? Ищите у p и q общие делители, если находите - делите и то, и то на этот самый делитель. И так пока делители не кончатся.
0
0 / 0 / 0
Регистрация: 09.12.2016
Сообщений: 3
06.06.2017, 20:50  [ТС] 5
Это я понимаю, конечно же. Не понимаю, как соорудить код в программе. Чтож, спасибо Вам.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
32457 / 17998 / 3766
Регистрация: 12.02.2012
Сообщений: 30,216
Записей в блоге: 5
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
1500 / 964 / 811
Регистрация: 30.04.2016
Сообщений: 3,334
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2017, 22:21
Помогаю со студенческими работами здесь

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

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

Составить программу для вычисления суммы цифр, стоящих на нечетных позициях, заданного пятизначного числа
Помогите пожалуйста

Вычисления суммы всех членов ряда не меньших заданного числа Е
помогите решить задачу составьте программу для вычисления суммы всех членов ряда не меньших...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru