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

Деление дробей. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
dmital
 Аватар для dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
11.08.2011, 11:20     Деление дробей. #1
Задача: вывести в порядке возрастания все правильные несократимые дроби со знаменателем, не превосходящим n.
Сам код:
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
#include <iostream>
#include <string>
using namespace std;
using std::string;
int main() {
int n,i,num,numi;
float last=0,min;
string temp;
cin>>n;
const int r=n-1;
int a[r];
for(i=1; i<=r ;i++)
 a[i]=1;
while (last<(r/(r+1))) {
min=1;
for (i=1; i<=r; i++) 
if (((a[i]/(i+1))<min)&&((a[i]/(i+1))> last))  {
min=(a[i]/(i+1));
numi=i;
temp=a[i]+"/"+(i+1);
}
last=min;
cout<<temp;
a[numi]++;
}
return 0;
}
Как должно работать: Создается массив из n-1 чисел, причем число a[i] представляет дробь a[i]/(i+1). Первоначально все числа равны единице. last - последняя выведенная дробь, сначала это значение равно нулю. До тех пор, пока не выведена дробь (n-1)/n, проходим весь массив, и выбираем минимальную из дробей вида a[i]/(i+1), запоминаем ее номер, и записываем в строку temp. После окончания цикла выводим дробь и увеличиваем на 1 a[i].
Проблема в том, что нужно как-то изменить процедуру деления, чтобы в результате деления двух целых чисел получалось дробное число, а не ноль, но я не знаю, как это сделать.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 11:20     Деление дробей.
Посмотрите здесь:

C++ сокрощение дробей
C++ Массив из дробей
C++ Классы дробей С++
Сложение дробей. C++
Сложение дробей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
11.08.2011, 11:24     Деление дробей. #2
int ни когда не будет дробным.
можно результирующую переменную сделать, допустим, double.
dmital
 Аватар для dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
11.08.2011, 11:35  [ТС]     Деление дробей. #3
Каким образом это сделать?
Я пробовал вот так, но не помогло, так как при делении все равно ноль получается.
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
#include <iostream>
#include <string>
using namespace std;
using std::string;
int main() {
int n,i,num,numi;
float last=0,min;
string temp;
cin>>n;
const int r=n-1;
int a[r];
for(i=1; i<=r ;i++)
 a[i]=1;
while (last<(r/(r+1))) {
min=1;
for (i=1; i<=r; i++) {
double z=a[i]/(i+1);
if ((z<min)&&(z>last))  {
min=(a[i]/(i+1));
numi=i;
temp=a[i]+"/"+(i+1);
}
}
last=min;
cout<<temp;
a[numi]++;
}
return 0;
}
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
11.08.2011, 11:42     Деление дробей. #4
Я бы делал так: создал структуру дроби с числителем и знаменателем. Далее написал функцию поиска НОДа, искал его для каждой дроби - если он не равен 1 тогда дробь сократимая и делаем с ней что надо, иначе дробь несократимая. Потом массив из дробей отсортировал так: приводил к общему знаменателю как НОК (заменатель1*знаменатель 2 / нод(знаменатель1,знаменатель2) и сравнивал.
IrineK
Заблокирован
11.08.2011, 11:42     Деление дробей. #5
Задача предполагает обязательный поиск НОД числителя и знаменателя. Если НОД>1, дробь сократима.
dmital
 Аватар для dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
11.08.2011, 11:51  [ТС]     Деление дробей. #6
Цитата Сообщение от Dani Посмотреть сообщение
Я бы делал так: создал структуру дроби с числителем и знаменателем. Далее написал функцию поиска НОДа, искал его для каждой дроби - если он не равен 1 тогда дробь сократимая и делаем с ней что надо, иначе дробь несократимая. Потом массив из дробей отсортировал так: приводил к общему знаменателю как НОК (заменатель1*знаменатель 2 / нод(знаменатель1,знаменатель2) и сравнивал.
Спасибо, но остается проблема с делением. Если нужно найти значение a/b, где а и b - целые, то что нужно сделать, чтобы результат оказался нецелого типа?
IrineK
Заблокирован
11.08.2011, 11:54     Деление дробей. #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int NOD(int x, int y)
{   if (y == 0) return x;
    return NOD(y, x % y);
}
 
int main()
{   int denominator, i;
    
    cout<<"Denominatior N = ";
    cin>>denominator;
 
    for(i=0;i<denominator;i++)
        if(NOD(i,denominator)==1) cout<<i<<"/"<<denominator<<" "; 
 
    cin.sync();cin.get();
    return 0;
}
Миниатюры
Деление дробей.  
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
11.08.2011, 11:56     Деление дробей. #8
Цитата Сообщение от dmital Посмотреть сообщение
Спасибо, но остается проблема с делением. Если нужно найти значение a/b, где а и b - целые, то что нужно сделать, чтобы результат оказался нецелого типа?
Так?
C++
1
float b=(float)a/b;
dmital
 Аватар для dmital
1 / 1 / 0
Регистрация: 18.02.2011
Сообщений: 20
11.08.2011, 11:59  [ТС]     Деление дробей. #9
IrineK, Dani, благодарю за советы, дальше, наверное, разберусь сам.
IrineK
Заблокирован
11.08.2011, 12:02     Деление дробей. #10
Задача решена. "Дальше" - некуда ))
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 12:14     Деление дробей. #11
В ряд Фарея разложить можно.
mac_alleb
7 / 7 / 0
Регистрация: 05.08.2011
Сообщений: 54
17.08.2011, 08:18     Деление дробей. #12
Уважаемый(ая) IrineK может быть с точки зрения математики задача и решена (хотя я и в этом
сомневаюсь ), а вот с точки зрения программирования - нет. Я думаю здесь подойдет полный перебор
деления чисел с критерием: если есть остаток - значит дробь несократима. Видимо основная задача -
деление двух целых больших чисел. Подскажите, насколько большое n . Берусь сделать на Tasm 5.0
за пару-тройку дней . Писать прогу?
Puporev
Модератор
 Аватар для Puporev
50351 / 38282 / 12257
Регистрация: 18.05.2008
Сообщений: 86,675
17.08.2011, 08:45     Деление дробей. #13
Цитата Сообщение от mac_alleb Посмотреть сообщение
если есть остаток - значит дробь несократима.
Это не так, по условию все дроби правильные, у всех есть только остаток и нет целой части.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2011, 22:18     Деление дробей.
Еще ссылки по теме:

Сокрашение дробей C++
сложение дробей C++
Упрощение дробей C++

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

Или воспользуйтесь поиском по форуму:
mac_alleb
7 / 7 / 0
Регистрация: 05.08.2011
Сообщений: 54
19.08.2011, 22:18     Деление дробей. #14
Сделал бинарное сложение и вычитание, а также часть деления для 248-битных чисел. Наверное,
в будующем, для полноты картины, потребуется еще и умножение , но на все это потребуется отличное
от 0 время , а то я устал за последнее время .
Yandex
Объявления
19.08.2011, 22:18     Деление дробей.
Ответ Создать тему
Опции темы

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