Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
#1

Сократить дробь - C++

21.11.2012, 14:18. Просмотров 3345. Ответов 10
Метки нет (Все метки)

Даны натуральные числа a и b, обозначающие соответственно числитель и знаменатель дроби. Сократите дробь, т.е найти такие натуральные p и q, не имеющие общих делителей, что p/q=a/b. (Необходимо выполнить через цикл, а и б вводятся с клавиатуры)
Очень надеюсь на вашу помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 14:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сократить дробь (C++):

Сократить дробь - C++
Смысл задачи в том, что когда ввожу например дробь 3/9 в результате мне должно вывести не скоротную дробь, то бишь 1/3

Необходимо сократить дробь - C++
Добрый день/вечер/ночь. Помогите пожалуйста знающие. Есть класс дробь, нужно ее сократить (показано комментариями): #include...

Сократить дробь используя функцию - C++
Используя функцию nod нахождения наибольшего общего делителя двух натуральных чисел, сократить данную обычную дробь m / n //Возвращает...

Составить программу , позволющую сократить дробь. - C++
M и N - числитель и знаменатель обыкновенной дроби. Составить программу , позволющую сократить дробь.

Сократить дробь, т е найти такие натуральные числа p и q , не имеющий общий делитель - C++
Даны натуральных числа a и b, обозначающие соответственно числитель и знаменатель дроби. Сократить дробь, т е найти такие натуральные числа...

N и M числитель и знаменатель дроби, составить программу, позволяющая сократить эту дробь. - C++
помогите пожалуйста

10
SatanaXIII
Супер-модератор
Эксперт С++
5650 / 2694 / 252
Регистрация: 01.11.2011
Сообщений: 6,588
Завершенные тесты: 1
21.11.2012, 15:12 #2
Вот придумалось так:
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
int main(int argc, char* argv[])
{
int a, b;
float p=0.0, q=0.0;
cin >> a >> b;
 
p=a; q=b;
 
for(int i=1; i<=a && i<=b; i++)
  {
  float aa=a%i;
  float bb=b%i;
  if(!(a%i) && !(b%i))
    {
    p=a/i;
    q=b/i;
    }
  }
cout << endl;
cout << p;
cout << endl;
cout << q;
 
cin.ignore(2);
 
        return 0;
}
1
N_J
261 / 60 / 4
Регистрация: 29.06.2012
Сообщений: 109
21.11.2012, 15:54 #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
30
31
32
33
#include <iostream>
using namespace std;
 
int nod(int numerator, int denominator);
 
int main(void)
{
    int num, denom, cd;
    cout << "Input numerator: ";
    cin >> num;
    cout << "\nInput denominator: ";
    cin >> denom;
    cd=nod(num, denom);
    cout << "Num: " << num/cd << "\nDenom: " << denom/cd <<"\n";
    return 0;
}
 
int nod(int numerator, int denominator)
{
    int num=numerator, denom=denominator, rem;
    if (num<denom)
    {
        int temp=num;
        num=denom;
        denom=temp;
    }
    while (rem=num%denom)
    {
        num=denom;
        denom=rem;
    }
    return denom;
}
1
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
21.11.2012, 21:49  [ТС] #4
Допишите необходимые библиотеки ф-ций, что б работало)) Благодарю Вас)

Добавлено через 2 минуты
Я извиняюсь, но я совсем не понял ход ваших мыслей) да и при выполнении программы, мне выводятся теже самые значения что я ввожу.. Обьясните пж)
0
N_J
261 / 60 / 4
Регистрация: 29.06.2012
Сообщений: 109
21.11.2012, 22:37 #5
Цитата Сообщение от Seriks Посмотреть сообщение
Я извиняюсь, но я совсем не понял ход ваших мыслей) да и при выполнении программы, мне выводятся теже самые значения что я ввожу.. Обьясните пж)
есть известный алгоритм вычисления наибольшего общего делителя двух чисел, заключающийся в следующем: из двух чисел выбирается большее и большее делится на меньшее; если остатка нет, то наибольший общий делитель - меньшее число; если же деление осуществляется с остатком, тогда на следующей итерации в роли делимого выступает бывший делитель, а в роли делителя - остаток, и находится новый остаток от деления. Аналогичные последовательные приближения осуществляются до тех пор, пока остаток не станет нулевым. Последнее значение делителя и будет наибольшим общим делителем двух исходных чисел. Этот алгоритм и реализует функция nod.
А из main() сначала вызываемое nod, а для получения сокращенных значений делим исходные значения на результат, возвращаемый функцией nod.
1
SatanaXIII
Супер-модератор
Эксперт С++
5650 / 2694 / 252
Регистрация: 01.11.2011
Сообщений: 6,588
Завершенные тесты: 1
22.11.2012, 09:36 #6
А у меня тогда метод грубой силы.
После ввода значений a и b они пересохраняются в p и q, это на случай, если не будет общих делителей. Тогда они так и останутся теми же введенными числами.
потом в цикле от одного до наименьшего из двух введенных (i<=a && i<=b) выполнять проверку: если остаток от деления равен нулю (!(a%i) && !(b%i)), то есть оба числа делятся на i без остатка, тогда p и q переписать. Так как i увеличивается, то p и q будут постоянно уменьшаться. И в итоге у нас в них будут лежать наименьшие возможные значения.
1
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
26.11.2012, 20:05  [ТС] #7
SatanaXIII, Можете пожалуйста добавить необходимые библиотеки ф-ций что-бы программа выполнялась?
0
SatanaXIII
Супер-модератор
Эксперт С++
5650 / 2694 / 252
Регистрация: 01.11.2011
Сообщений: 6,588
Завершенные тесты: 1
27.11.2012, 09:46 #8
А.
Ну там только
C++
1
#include <iostream.h>
вначале нужно.
И еще в 11 и 12 строке надо выкинуть
C++
1
2
  float aa=a%i;
  float bb=b%i;
они никакой нагрузки не несут. Для отладки воткнул, да так и забыл.
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
27.11.2012, 10:57 #9
Пусть c - любой общий делитель a и b. Тогда http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a}{b}=\frac{\left(\frac{a}{c} \right)}{\left(\frac{b}{c} \right)}. Далее если числитель и знаменатель этой дроби имеют общие делители, то её можно сократить аналогично. После того, как окажутся сокращены все получающиеся при сокращении эквивалентные дроби, окажется, что произведение всех использованных делителей равно наибольшему общему делителю a и b. Причём всякий общий делитель http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a}{с} и http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{b}{с} одновременно является общим делителем a и b.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void f(int a, int b, int &p, int &q)
{
 int c;
 p=a;
 q=b;
 bool flag;
 for (flag=true; flag; )
 {
  for (flag=false, c=abs(p); c>0; --c)
  {  
   if (((abs(p)%c)==0)&&((abs(q)%c)==0))
   {
    p/=c;
    q/=c;
    flag=true;
   }
  }
 }
}
Добавлено через 6 минут
И целиком:
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 <iostream.h>
void f(int a, int b, int &p, int &q);
int main ()
{
 int a, b, p, q;
 std::cout<<"введите числитель (a) и знаменатель (b):"<<std::endl;
 std::cout<<"a="<<std::endl;
 std::cin>>a;
 std::cout<<"b="<<std::endl;
 std::cin>>b;
 f(a,b,p,q);
 std::cout<<a<<"/"<<b<<"="<<p<<"/"<<q<<", то есть p="<<p<<", q="<<q<<endl;
}
void f(int a, int b, int &p, int &q)
{
 int c;
 p=a;
 q=b;
 bool flag;
 for (flag=true; flag; )
 {
  for (flag=false, c=abs(p); c>0; --c)
  {  
   if (((abs(p)%c)==0)&&((abs(q)%c)==0))
   {
    p/=c;
    q/=c;
    flag=true;
   }
  }
 }
}
0
0x10
2509 / 1687 / 253
Регистрация: 24.11.2012
Сообщений: 4,231
27.11.2012, 11:08 #10
taras atavin, зачем городить пачку флагов и циклов, когда есть простой и красивый алгоритм Евклида для поиска НОД?
0
SatanaXIII
Супер-модератор
Эксперт С++
5650 / 2694 / 252
Регистрация: 01.11.2011
Сообщений: 6,588
Завершенные тесты: 1
27.11.2012, 11:26 #11
taras atavin, а чем от моего решения отличается? Так же сравнение по нулевым остаткам, плюс на флаг больше.
P.S. Конечно же в 24 строке использовать abs() это верно подмечено. Для отрицательных дробей.
0
27.11.2012, 11:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 11:26
Привет! Вот еще темы с ответами:

Используя функцию нахождения НОД двух натуральных чисел, сократить обычную дробь - C++
Используя функцию nod нахождения наибольшего общего делителя двух натуральных чисел, сократить данный обычный дробь m / n //возвращает...

Как написать класс «несократимая дробь» (т.е. дроби 2/4, 4/8 и т.п. есть дробь 1/2)? - C++
Я только начанаю знакомство с C++. В классе реализовать следующие методы: конструкторы (по умолчанию, с параметрами, копирования), ввод с...

Дробь - C++
Нужен шаблон класса &quot;дробь&quot; с именем TFraction, подобный обыкновенной дроби в том, что данная TFraction должен иметь числитель и...

Сократить выражение - C++
Здравствуйте Фрагмент кода: Sum-=(c=Sum/25)*25; coins+=c; Sum-=(c=Sum/10)*10; coins+=c; ...


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

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

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