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

Сокращение дроби - C++

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

сокращение дроби C++
C++ Сокращение кода
Сокращение кода C++
Сокращение кода C++
Сокращение дроби C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 20:17     Сокращение дроби #2
а чем эта тема отличается от ранее созданной вами?
Сократить дробь

даже md5() текста сообщения одинаковые =)
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
26.11.2012, 20:19  [ТС]     Сокращение дроби #3
Ну ее уже все забыли*( а программа позарез нужна. Если Вы подскажете как поднимать тему поверх более новых - большое спасибо)
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 20:23     Сокращение дроби #4
ее никто и не забывал, последнее сообщение там было 15 мин. назад - тема поднялась

Добавлено через 1 минуту
да и вашу программу там решили
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
26.11.2012, 20:28  [ТС]     Сокращение дроби #5
ps10n1ck, ниодин из приведеных кодов не работает(
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 20:35     Сокращение дроби #6
вот эта точно работает
Сократить дробь
что у вас там не работает?
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
26.11.2012, 20:36  [ТС]     Сокращение дроби #7
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;
}
Этот хотелось бы)
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
27.11.2012, 19:11     Сокращение дроби #8
позже я вам напишу более разумный вариант с комментариями, приведенный выше - бред какой-то

Добавлено через 22 часа 0 минут
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
 
typedef unsigned int uint;
 
int main(){
  setlocale(LC_ALL, "rus");
  
  uint nMenu = 0; // меню
  uint nNumerator = 0; // числитель
  uint nDenominator = 0; // знаменатель
  uint nMostCommonMultiple = 0; // наибольшее общее кратное
 
  // вывод меню
  cout << "Выберите ваше действие:" << endl;
  cout << "1. Ввести дробь" << endl;
  cout << "0. Завершить программу" << endl;
  cout << "Ваш выбор: ";
  
  // запускаем цикл выбора меню и его обработку
  while(cin >> nMenu && nMenu != 0){
    switch(nMenu) {
      // если выбран вариант ввода дроби
      case 1:
        cout << "Введите числитель: ";
        cin >> nNumerator; // вводим числитель
        cout << "Введите знаменатель: ";
        cin >> nDenominator; // вводим знаменатель
 
        // наибольшее общее кратное = числитель
        nMostCommonMultiple = nNumerator;
 
        // запускаем цикл для поиска наибольшего общего кратного
        // наибольшее общее кратное != 1 (1 - наименьшее общее кратное)
        while(nMostCommonMultiple > 1) {
          // проверяем, если числитель и знаменатель делятся на наибольшее общее кратное
          // без остатка, то выводим сокращенную дробь и прерываем цикл проверки
          if((nNumerator % nMostCommonMultiple) == 0 && (nDenominator % nMostCommonMultiple) == 0){
            cout << "Наибольшее общее кратное = " << nMostCommonMultiple << endl;
            // если числитель больше знаменателя или числитель равен знаменателю
            // и деление числителя на знаменатель не дает остатка, то это будет целое число
            if((nNumerator > nDenominator || nNumerator == nDenominator)&& nNumerator % nDenominator == 0)
              cout << "Сокращенная дробь: " << nNumerator/nDenominator << endl;
            // если числитель больше знаменателя
            // выводим целую часть и дробную часть в виде 1(2/3)- одна целая и две третьих
            else if(nNumerator > nDenominator) {
              cout << "Сокращенная дробь: " << nNumerator/nDenominator << "("
              << (nNumerator/nMostCommonMultiple) - (nDenominator/nMostCommonMultiple) << "|"
              << nDenominator/nMostCommonMultiple << ")" << endl;
            }
            // если целой части нет, то просто выводим сокращенную дробь
            else
              cout << "Сокращенная дробь: " << nNumerator/nMostCommonMultiple << "|" << nDenominator/nMostCommonMultiple << endl;
            break;
          }
          
          // если при делении числителя и знаменателя на наибольшее общее кратное
          // есть остаток, то просто уменьшаем наибольшее общее кратное на 1 и продолжаем проверку
          --nMostCommonMultiple;
        }
        
        // если же наибольшее общее кратное = 1, то дробь невозможно сократить
        if(nMostCommonMultiple == 1)
          cout << "Невозможно сократить дробь" << endl << endl;
        break;
 
        // обработка неверных вариантов выбора меню
        default:
        break;
    }
    // после обработки дроби выводим снова меню
    cout << "Выберите ваше действие:" << endl;
    cout << "1. Ввести дробь" << endl;
    cout << "0. Завершить программу" << endl;
    cout << "Ваш выбор: ";
  }
 
  system("pause");
return 0;
}
Добавлено через 6 минут
вот результат работы программы:
[img]http://s018.***********/i508/1211/b7/dfc3e28f38ect.jpg[/img]

Добавлено через 24 минуты
еще забыл дописать, что это самый простой вариант
данный алгоритм будет долго работать при больших числах
вернусь с работы, выложу более облегченный и быстрый вариант
Seriks
7 / 0 / 1
Регистрация: 08.10.2012
Сообщений: 124
28.11.2012, 17:02  [ТС]     Сокращение дроби #9
ОГРОМНОЕ СПАСИБО) Но я можно более облегченный вариант. Мне не поверят что это я написал если по правде) спасибо еще раз

Добавлено через 26 минут
Код классный) но я изучаю с++ 1й месяц на уровне ниже среднего, и данная программа точно мне не по зубам.. Возможно ли упростить еще код)?

Добавлено через 17 часов 42 минуты
Все все все) уже переделал немного Ваш код, что б подходил по моим критериям) спасибо за помощь!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 17:09     Сокращение дроби
Еще ссылки по теме:

Сокращение кода C++
C++ Сокращение дробей, поиск наименьшей дроби
Сокращение дробей до несократимого вида C++

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

Или воспользуйтесь поиском по форуму:
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
28.11.2012, 17:09     Сокращение дроби #10
Вот этот вариант я думаю будет по проще num и den выступают как числитель и знаменатель соответственно. функция написана как метод класса. Если вы хотите ее использовать вне класса следует указать целочисленные аргументы в определении и в прототипе, если вы используете прототип.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
lowterms()
{
        long tnum,tden,temp,gcd;
        tnum = labs(num);
        tden = labs(den);
        if( tden == 0 )
        { cout<<" 0 denominator is not acceptable! "; exit(1);}
        else if( tnum == 0 )
        { num=0; den=1; return; }
        while( tnum != 0 )
        {
 
        if( tnum < tden )
        { temp=tnum; tnum=tden; tden=temp; }
 
        tnum = tnum - tden;
        }
        gcd = tden;
        num = num / gcd;
        den = den /gcd;
}
Yandex
Объявления
28.11.2012, 17:09     Сокращение дроби
Ответ Создать тему
Опции темы

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