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

Программа для представления дроби в виде суммы различных дробей. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.81
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
20.09.2010, 18:28     Программа для представления дроби в виде суммы различных дробей. #1
Представить дробь p/q (0<p<q<16) в виде суммы различных дробей, числитель которых равен 1.
На С++ только начал программировать, поэтому даже не представляю как такое можно сделать в виде программы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2010, 18:28     Программа для представления дроби в виде суммы различных дробей.
Посмотрите здесь:

C++ Задача на масив.Ввод дробей и вычисление среднего значения дроби!
Составить программу для нахождения суммы в виде несократимой дроби. C++
Напишите программу, запрашивающую у пользователя значения двух дробей, а затем выводящую результат, также записанный в форме дроби C++
нахождение среднего значения суммы дробей C++
C++ Программа должна выводить аналог целочисленной таблицы умножения для дробей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
D@rkD@iver
110 / 110 / 3
Регистрация: 01.10.2008
Сообщений: 876
20.09.2010, 18:32     Программа для представления дроби в виде суммы различных дробей. #2
ну как мне кажется, это довольно просто
3/7= 1/7+1/7+1/7
просто p раз написать 1/q
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
20.09.2010, 18:34  [ТС]     Программа для представления дроби в виде суммы различных дробей. #3
Как математически это представить я понимаю, а вот как это организовать на языке С++ в виде программы даже не представляю...
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
20.09.2010, 18:46     Программа для представления дроби в виде суммы различных дробей. #4
попробуй переделать программу из твоей предыдущей темы
тут можно
C++
1
for(int i=0;i<p;i++) cout<<"1/"<<q;
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
20.09.2010, 18:51  [ТС]     Программа для представления дроби в виде суммы различных дробей. #5
А я вот тут сам написал код, но опять же он не работает. Тоесть компилируется, но не выводить результат.
Посмотрите, пожалуйста:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
void main ()
{
    int p, q,i=0;
    cout<<"Vvedite p\n";
    cin>>p;
    cout<<"Vvedite q\n";
    cin>>q;
    while (i<p);
    {
        i++;
        cout<<"+1/"<<q;
    }
}
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
20.09.2010, 18:54     Программа для представления дроби в виде суммы различных дробей. #6
м... консоль сразу закрывается после выполнения или что ?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
20.09.2010, 18:54     Программа для представления дроби в виде суммы различных дробей. #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main ()
{
        int p, q,i=0;
        cout<<"Vvedite p\n";
        cin>>p;
        cout<<"Vvedite q\n";
        cin>>q;
        for (int i = 0; i < p; i++)
        {
                cout<<"+1/"<<q<< endl;
        }
        system("pause")
}
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
20.09.2010, 18:58  [ТС]     Программа для представления дроби в виде суммы различных дробей. #8
Нет, у меня появляются поля ввода, я ввожу p и q и все. Дальше ничего не происходит. Программа не закрывается, а просто ничего не делает.

Добавлено через 3 минуты
Цитата Сообщение от Asics^ Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main ()
{
        int p, q,i=0;
        cout<<"Vvedite p\n";
        cin>>p;
        cout<<"Vvedite q\n";
        cin>>q;
        for (int i = 0; i < p; i++)
        {
                cout<<"+1/"<<q<< endl;
        }
        system("pause")
}
Спасибо! Этот вариант работает, только нужно сделать i <= p. Но при выводе у меня сумма на разных строках, тоесть 1/6
1/6. А можно сделать на одной строке?

И попутно заметил еще один существенный баг: программа выводит максимум 4 слагаемых! А при p=5 их всего 3. Тоесть 1/9+1/9+1/9...
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
20.09.2010, 19:00     Программа для представления дроби в виде суммы различных дробей. #9
dyap, Как то так ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
        int p, q;
        cout<<"Vvedite p\n";
        cin>>p;
        cout<<"Vvedite q\n";
        cin>>q;
        for (int i = 0; i < p; i++)
        {
                cout<<"+1/"<<q;
        }
        getch();
}
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
21.09.2010, 14:47  [ТС]     Программа для представления дроби в виде суммы различных дробей. #10
Цитата Сообщение от Asics^ Посмотреть сообщение
dyap, Как то так ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
        int p, q;
        cout<<"Vvedite p\n";
        cin>>p;
        cout<<"Vvedite q\n";
        cin>>q;
        for (int i = 0; i < p; i++)
        {
                cout<<"+1/"<<q;
        }
        getch();
}
А вот так все работает корректно! Спасибо!!!

Добавлено через 19 часов 43 минуты
Вообщем предыдущие предложенные варианты не подходят! В условии сказано, что дроби должны быть различны (собственно поэтому и п и q меньше 16). Есть у кого-нибудь идеи?)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.09.2010, 15:34     Программа для представления дроби в виде суммы различных дробей. #11
dyap, мда, не тривиальная задачка, неужели никакого теоретического материала (не по программированию, по математике) не дали?
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
21.09.2010, 17:12  [ТС]     Программа для представления дроби в виде суммы различных дробей. #12
silent_1991,
Немного теории дали:
Типы данных и переменные, Числовые типы данных, Арифметические операции над числами, Форматированный ввод и вывод чисел, Логические операторы и операторы сравнения, Условные инструкции if и if-else, Инструкции цикла while и do-while, Инструкция цикла for, Инструкция выбора switch, Блоки, Стандартная библиотека математических функций.
Просто нам лектор попался неудачный, мало кто понимает, что он говорит. А на практике система еще хуже: 11 человек и препод начинает подходить по списку, спрашивать есть ли вопросы. А я в списке последний. 2 пары пытался спросить, так до меня и не дошло Хорошо хоть на этом форуме помогли.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.09.2010, 17:15     Программа для представления дроби в виде суммы различных дробей. #13
Я же уточнил - теорию не по программированию, а по математике. Задачка-то не простая, школьных знаний, по моему, не достаточно, это что-нибудь из теории чисел...
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
21.09.2010, 17:17  [ТС]     Программа для представления дроби в виде суммы различных дробей. #14
Ой, сори. По математике мы сейчас совсем другое проходим. Так что теории нет...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.09.2010, 17:19     Программа для представления дроби в виде суммы различных дробей. #15
Просто по идее, когда даётся лаба по программированию, всегда идёт краткая теория, даже если надо найти площадь круга. А тут на тебе. Вывалили задачу и е... с ней как хочешь...
dyap
2 / 2 / 0
Регистрация: 20.09.2010
Сообщений: 58
27.09.2010, 20:51  [ТС]     Программа для представления дроби в виде суммы различных дробей. #16
Сказали почитать Приближение числа в виде дроби. Там написано: Для действительного числа r>0 и натурального числа qmax необходимо найти наилучшее приближение r в виде рациональной дроби p/q, где q<=qmax.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
p:=0; q:=1;
metka:
     if p/q < r then p:=p+1;
     if p/q = r then stop;
     if p/q > r then q:=q+1;
     if q > qmax then stop;
     goto metka;
PROGRAM ratap;
VAR p,q,qmax:integer;
    d, r, min: real;
BEGIN
   write('r,qmax='); readln(r,qmax);
   p:=0; q:=1; min:=r; REPEAT
   IF p/q<r THEN p:=p+1 ELSE q:=q+1;
   d:=abs(r-p/q);
   IF d<min THEN BEGIN min:=d; writeln(p:7,'/',q) END
UNTIL (q>=qmax) OR (d=0);
readln; END.
Пример я так понял написан на Паскале. Как это использовать в данной задаче не представляю... Может кто-нибудь понял?...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2010, 14:27     Программа для представления дроби в виде суммы различных дробей.
Еще ссылки по теме:

Длинная арифметика, представления чисел в двоичном виде C++
Представление натурального N в виде суммы не менее двух попарно различных положительных слагаемых C++
C++ Сокращение дробей, поиск наименьшей дроби

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
28.09.2010, 14:27     Программа для представления дроби в виде суммы различных дробей. #17
Цитата Сообщение от dyap Посмотреть сообщение
Сказали почитать Приближение числа в виде дроби. Там написано: Для действительного числа r>0 и натурального числа qmax необходимо найти наилучшее приближение r в виде рациональной дроби p/q, где q<=qmax.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
p:=0; q:=1;
metka:
     if p/q < r then p:=p+1;
     if p/q = r then stop;
     if p/q > r then q:=q+1;
     if q > qmax then stop;
     goto metka;
PROGRAM ratap;
VAR p,q,qmax:integer;
    d, r, min: real;
BEGIN
   write('r,qmax='); readln(r,qmax);
   p:=0; q:=1; min:=r; REPEAT
   IF p/q<r THEN p:=p+1 ELSE q:=q+1;
   d:=abs(r-p/q);
   IF d<min THEN BEGIN min:=d; writeln(p:7,'/',q) END
UNTIL (q>=qmax) OR (d=0);
readln; END.
Пример я так понял написан на Паскале. Как это использовать в данной задаче не представляю... Может кто-нибудь понял?...
Идея здесь следующая:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <iostream>
//////////////////////////////////////////////////////////////////////////////////
typedef long double  T_real;
typedef long long    T_int;
//////////////////////////////////////////////////////////////////////////////////
T_real  div_real(T_int  p, T_int  q)
{
    return static_cast<T_real>(p) / static_cast<T_real>(q);
}
//////////////////////////////////////////////////////////////////////////////////
T_real  get_delta
    (
        T_real  r,
        T_int   p,
        T_int   q
    )
{
    return abs(r - div_real(p, q));
}
//////////////////////////////////////////////////////////////////////////////////
void  get_p_q
    (
        T_real   r, 
        T_int    q_max,         
        T_int&   p_best,
        T_int&   q_best,
        T_real&  delta_best 
    )
{        
    delta_best = r;    
 
    for(T_int  p_cur = 0, q_cur = 1; 
        delta_best && q_cur <= q_max; 
        div_real(p_cur, q_cur) < r ? ++p_cur : ++q_cur)
    {
        T_real  delta_cur = get_delta(r, p_cur, q_cur);     
        if(delta_cur < delta_best)
        {            
            p_best      = p_cur;
            q_best      = q_cur;
            delta_best  = delta_cur;
        }                                    
    }
}
//////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    T_real  r;
    do
    {
        std::cout << "Введите действительное число > 0: ";    
        std::cin >> r;   
    }while(r <= 0);
 
    T_int  q_max;
    do
    {
        std::cout << "Введите максимальное значение знаменателя дроби >= 1: ";
        std::cin >> q_max;    
    }while(q_max < 1);  
    
    T_int   p      = 0;
    T_int   q      = 0;
    T_real  delta  = 0;
    get_p_q(r, q_max, p, q, delta);
    std::cout << "Число " 
              << r
              << " приблизительно равно дроби "
              << p
              << " / "
              << q
              << " с точностью "
              << delta
              << "."
              << std::endl;
}
Yandex
Объявления
28.09.2010, 14:27     Программа для представления дроби в виде суммы различных дробей.
Ответ Создать тему
Опции темы

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