Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
Seriks
7 / 0 / 8
Регистрация: 08.10.2012
Сообщений: 124
#1

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

21.11.2012, 14:18. Просмотров 3900. Ответов 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++):

Сократить дробь
Даны натуральные числа a и b, обозначающие соответственно числитель и...

Сократить дробь
Смысл задачи в том, что когда ввожу например дробь 3/9 в результате мне должно...

Необходимо сократить дробь
Добрый день/вечер/ночь. Помогите пожалуйста знающие. Есть класс дробь, нужно ее...

Сократить дробь используя функцию
Используя функцию nod нахождения наибольшего общего делителя двух натуральных...

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

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

10
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 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
262 / 61 / 5
Регистрация: 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 / 8
Регистрация: 08.10.2012
Сообщений: 124
21.11.2012, 21:49  [ТС] #4
Допишите необходимые библиотеки ф-ций, что б работало)) Благодарю Вас)

Добавлено через 2 минуты
Я извиняюсь, но я совсем не понял ход ваших мыслей) да и при выполнении программы, мне выводятся теже самые значения что я ввожу.. Обьясните пж)
0
N_J
262 / 61 / 5
Регистрация: 29.06.2012
Сообщений: 109
21.11.2012, 22:37 #5
Цитата Сообщение от Seriks Посмотреть сообщение
Я извиняюсь, но я совсем не понял ход ваших мыслей) да и при выполнении программы, мне выводятся теже самые значения что я ввожу.. Обьясните пж)
есть известный алгоритм вычисления наибольшего общего делителя двух чисел, заключающийся в следующем: из двух чисел выбирается большее и большее делится на меньшее; если остатка нет, то наибольший общий делитель - меньшее число; если же деление осуществляется с остатком, тогда на следующей итерации в роли делимого выступает бывший делитель, а в роли делителя - остаток, и находится новый остаток от деления. Аналогичные последовательные приближения осуществляются до тех пор, пока остаток не станет нулевым. Последнее значение делителя и будет наибольшим общим делителем двух исходных чисел. Этот алгоритм и реализует функция nod.
А из main() сначала вызываемое nod, а для получения сокращенных значений делим исходные значения на результат, возвращаемый функцией nod.
2
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 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 / 8
Регистрация: 08.10.2012
Сообщений: 124
26.11.2012, 20:05  [ТС] #7
SatanaXIII, Можете пожалуйста добавить необходимые библиотеки ф-ций что-бы программа выполнялась?
0
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 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
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
27.11.2012, 11:08 #10
taras atavin, зачем городить пачку флагов и циклов, когда есть простой и красивый алгоритм Евклида для поиска НОД?
0
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 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
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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