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

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

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

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

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

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

Используя функцию нахождения НОД двух натуральных чисел, сократить обычную дробь C++
Как написать класс «несократимая дробь» (т.е. дроби 2/4, 4/8 и т.п. есть дробь 1/2)? C++
Сократить дробь используя функцию C++
C++ N и M числитель и знаменатель дроби, составить программу, позволяющая сократить эту дробь.
C++ Дробь
Составить программу , позволющую сократить дробь. C++
факториал сократить C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
5589 / 2623 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 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;
}
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;
}
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
21.11.2012, 21:49  [ТС]     Сократить дробь #4
Допишите необходимые библиотеки ф-ций, что б работало)) Благодарю Вас)

Добавлено через 2 минуты
Я извиняюсь, но я совсем не понял ход ваших мыслей) да и при выполнении программы, мне выводятся теже самые значения что я ввожу.. Обьясните пж)
N_J
261 / 60 / 4
Регистрация: 29.06.2012
Сообщений: 109
21.11.2012, 22:37     Сократить дробь #5
Цитата Сообщение от Seriks Посмотреть сообщение
Я извиняюсь, но я совсем не понял ход ваших мыслей) да и при выполнении программы, мне выводятся теже самые значения что я ввожу.. Обьясните пж)
есть известный алгоритм вычисления наибольшего общего делителя двух чисел, заключающийся в следующем: из двух чисел выбирается большее и большее делится на меньшее; если остатка нет, то наибольший общий делитель - меньшее число; если же деление осуществляется с остатком, тогда на следующей итерации в роли делимого выступает бывший делитель, а в роли делителя - остаток, и находится новый остаток от деления. Аналогичные последовательные приближения осуществляются до тех пор, пока остаток не станет нулевым. Последнее значение делителя и будет наибольшим общим делителем двух исходных чисел. Этот алгоритм и реализует функция nod.
А из main() сначала вызываемое nod, а для получения сокращенных значений делим исходные значения на результат, возвращаемый функцией nod.
SatanaXIII
Супер-модератор
Эксперт С++
5589 / 2623 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 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 будут постоянно уменьшаться. И в итоге у нас в них будут лежать наименьшие возможные значения.
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
26.11.2012, 20:05  [ТС]     Сократить дробь #7
SatanaXIII, Можете пожалуйста добавить необходимые библиотеки ф-ций что-бы программа выполнялась?
SatanaXIII
Супер-модератор
Эксперт С++
5589 / 2623 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 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;
они никакой нагрузки не несут. Для отладки воткнул, да так и забыл.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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;
   }
  }
 }
}
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
27.11.2012, 11:08     Сократить дробь #10
taras atavin, зачем городить пачку флагов и циклов, когда есть простой и красивый алгоритм Евклида для поиска НОД?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 11:26     Сократить дробь
Еще ссылки по теме:

C++ Сократить дробь
Сократить дробь, т е найти такие натуральные числа p и q , не имеющий общий делитель C++
C++ Сократить выражение
C++ Необходимо сократить дробь
C++ Бесконечна ли дробь

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
5589 / 2623 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 1
27.11.2012, 11:26     Сократить дробь #11
taras atavin, а чем от моего решения отличается? Так же сравнение по нулевым остаткам, плюс на флаг больше.
P.S. Конечно же в 24 строке использовать abs() это верно подмечено. Для отрицательных дробей.
Yandex
Объявления
27.11.2012, 11:26     Сократить дробь
Ответ Создать тему
Опции темы

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