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

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

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

используя функцию nod нахождения найбыльшого общего делителя двух натуральных чисел, сократить данный обычный дробь m / n C++
Как написать класс «несократимая дробь» (т.е. дроби 2/4, 4/8 и т.п. есть дробь 1/2)? C++
Сократить дробь используя функцию C++
C++ N и M числитель и знаменатель дроби, составить программу, позволяющая сократить эту дробь.
Составить программу , позволющую сократить дробь. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 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
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 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
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 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
Ушёл с форума.
 Аватар для 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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.11.2012, 11:08     Сократить дробь #10
taras atavin, зачем городить пачку флагов и циклов, когда есть простой и красивый алгоритм Евклида для поиска НОД?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 11:26     Сократить дробь
Еще ссылки по теме:

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

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

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

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