Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9

Для числителя и знаменателя дроби получить знак, целую часть, сокращенные числитель и знаменатель.

21.11.2017, 11:01. Показов 5242. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Немного не понимаю как в этой задаче вывести сокращенные числитель и знаменатель. остальное всё сделал.
Темы с такой же задачей уже просмотрел, не подходят мне. Нужно ОБЯЗАТЕЛЬНО использовать цикл while.

Задача
Вводятся числитель и знаменатель дроби. Вывести: знак, целую часть, сокращенные числитель и знаменатель.

Мой код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main()
{
    cout << "Enter a / b" << endl;
    int a, b;
    cin >> a >> b;
    if (a / b < 0) cout << "Sign -"; else cout << "Sign +" << endl;
    cout << "Difference= " << a / b << endl;
    
    system("PAUSE");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2017, 11:01
Ответы с готовыми решениями:

Вводятся числитель a и знаменатель b дроби. Вывести: знак, целую часть, сокращенные числитель и знаменатель
Вводятся числитель a и знаменатель b дроби. Вывести: знак, целую часть, сокращенные числитель и знаменатель.

Вывести: знак, целую часть, сокращенные числитель и знаменатель дроби
Вводятся числитель a и знаменатель b дроби. Вывести: знак, целую часть, сокращенные числитель и знаменатель.

Вывести: знак, целую часть, сокращенные числитель и знаменатель
Вводятся числитель и знаменатель дроби. Вывести: знак, целую часть, сокращенные числитель и знаменатель. Кто может помочь сделать код...

23
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,918
21.11.2017, 11:26
Если так уж нужен while, перебирайте числа по одному пока не найдете такое на которое они оба делялся
C
1
2
3
4
5
num=b;
while(num>1){
  if(/*если оба делятся нацело*/){a/=num; b/=num; break;}
  num--;
}
По-хорошему это решается поиском наибольшего общего делителя
0
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
21.11.2017, 12:34  [ТС]
/*если оба делятся нацело*/ = (a%num==0 && a%num==0)?
Если так, то не правильно получается.
И да, нужен обязательно while
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,918
21.11.2017, 12:46
Цитата Сообщение от fLur2017 Посмотреть сообщение
(a%num==0 && a%num==0)
Вы два раза проверяете числитель.
Цитата Сообщение от fLur2017 Посмотреть сообщение
Если так, то не правильно получается.
На каких входных данных? У меня сработало нормально.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.11.2017, 12:48
C++
1
2
3
4
5
6
7
8
9
10
11
12
int Nod(int a, int b)  // Улучшенный алгоритм Эвклида
{
   while(a) {
     if (a <b) {
      int t = a;
      a = b;
      b = t;
    }
    a = a%b; 
  }
  return b;
}
0
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
21.11.2017, 13:27
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>
 
int main()
{
    int z = 32, ch = 2; //z - знаменатель, ch - числитель
 
    int dev = 2;
    int m_dev;
 
    if (z > ch)
        m_dev = ch;
    else
        m_dev = z;
 
    while (dev <= m_dev && (ch != 1 || z != 1))
    {
        if (!(z % dev) && !(ch % dev))
        {
            z /= dev;
            ch /= dev;
 
            if ((z % dev) && (ch % dev))
                dev++;
        }
        else {
            dev++;
        }
    }
 
    std::cout << ch << "/" << z;
 
    std::cin.ignore();
}
Добавлено через 13 минут
Немного подумал, убрал m_dev.

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
int main()
{
    int z = 32, ch = 2; //z - знаменатель, ch - числитель
 
    int dev = 2;
 
    while (dev <= ((z > ch) ? ch : z) && (ch != 1 || z != 1))
    {
    if (!(z % dev) && !(ch % dev))
    {
       z /= dev;
       ch /= dev;
 
       if ((z % dev) && (ch % dev))
          dev++;
    }
    else {
       dev++;
    }
     }
 
    std::cout << ch << "/" << z;
 
    std::cin.ignore();
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.11.2017, 13:41
SlavaSokolov, в 22 (16) строчке подразумевалось "или"?
Кроме того, продолжать цикл, когда ch или z равно 1 довольно бессмысленно. (или я запутался в условиях?)
Ну, об эффективности вашего кода говорить просто не стоит.

Добавлено через 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
#include <iostream>
using namespace std;
int main()
{
    cout << "Enter a / b" << endl;
    int a, b;
    cin >> a >> b;
    if (a / b < 0)  // Тут опасность!!! А если b==0 ?
      cout << "Sign -"; else cout << "Sign +" << endl;
   a1 = a;
   b1 = b;
   while(a1) {
     if (a1 <b1) {
      int t = a1;
      a1 = b1;
      b1 = t;
    }
    a1 = a1%b1; 
  }
  cout << a/b1 <<  "/" << b/b1 <, endl;
    system("PAUSE");
    return 0;
}
0
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
21.11.2017, 13:41
Цитата Сообщение от Байт Посмотреть сообщение
в 22 (16) строчке подразумевалось "или"
Да...
Цитата Сообщение от Байт Посмотреть сообщение
Кроме того, продолжать цикл, когда ch или z равно 1 довольно бессмысленно. (или я запутался в условиях?)
Ну так он прервётся, если знаменатель или числитель = 1.
C++
1
(ch != 1 || z != 1)
Цитата Сообщение от Байт Посмотреть сообщение
Ну, об эффективности вашего кода говорить просто не стоит.
Почему?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.11.2017, 17:58
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Ну так он прервётся, если знаменатель или числитель = 1.
Выражение
C++
1
2
(ch != 1 || z != 1) // Дает true при ch= 1, z = 5
    // Видимо, здесь нужно &&
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Почему?
Потому что он чудовищно не эффективен
Посмотрите, что он будет вытворять при z = 10000000, ch = 10000001
В то время как улучшенный алгоритм Эвклида (посты 5, 7) дает ответ на 2-м проходе.

Добавлено через 4 часа 10 минут
Байт, изучил предложенный вами алгоритм досконально. У меня есть только один вопрос: можно хотя бы в теории сделать быстрее?
Имхо, лучше продолжить обсуждение в теме. Вдруг кто-то знает об этом побольше. Мои познания в Теории Чисел кончаются на вполне наивном уровне
Чтобы понять как работает Улучшенный Алгоритм Эвклида, имхо , достаточно взять несколько пар чисел и прокрутить его вручную.
Что касается его улучшений, я не знаю. Во всяком случае простых. И, наверное, есть. Это все близко к проблеме факторизации (разложение на множители). А она весьма интересна криптографам. Сами понимаете, это направление бурно развивается. И да, конечно требует серьезных познаний в математике. И эффект может сказаться только на очень больших числах (которые криптографам, собственно, и интересны). Так что если копать, то где-то в этих областях...
1
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
21.11.2017, 20:55  [ТС]
Всё отлично, кроме того, что не выводит сокращённые делитель и знаменатель. То есть , если a=23, а b=8, То должно вывести Sign+ 2 7/8

Добавлено через 30 секунд
a=23
b=8
Не выводит правильно
0
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
21.11.2017, 21:06  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
SlavaSokolov, в 22 (16) строчке подразумевалось "или"?
Кроме того, продолжать цикл, когда ch или z равно 1 довольно бессмысленно. (или я запутался в условиях?)
Ну, об эффективности вашего кода говорить просто не стоит.

Добавлено через 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
#include <iostream>
using namespace std;
int main()
{
    cout << "Enter a / b" << endl;
    int a, b;
    cin >> a >> b;
    if (a / b < 0)  // Тут опасность!!! А если b==0 ?
      cout << "Sign -"; else cout << "Sign +" << endl;
   a1 = a;
   b1 = b;
   while(a1) {
     if (a1 <b1) {
      int t = a1;
      a1 = b1;
      b1 = t;
    }
    a1 = a1%b1; 
  }
  cout << a/b1 <<  "/" << b/b1 <, endl;
    system("PAUSE");
    return 0;
}
во вложении прикрепил, что мне выдаёт.
Миниатюры
Для числителя и знаменателя дроби получить знак, целую часть, сокращенные числитель и знаменатель.  
0
174 / 134 / 105
Регистрация: 14.04.2016
Сообщений: 719
21.11.2017, 21:08
Цитата Сообщение от fLur2017 Посмотреть сообщение
во вложении прикрепил, что мне выдаёт.
И в чём проблема то?
0
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
21.11.2017, 21:11  [ТС]
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
И в чём проблема то?
В последней строке выдал 23/8, когда ,по идее, должно было быть 7/8(сокращённые делитель и знаменатель)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.11.2017, 21:23
Цитата Сообщение от fLur2017 Посмотреть сообщение
В последней строке выдал 23/8, когда ,по идее, должно было быть 7/8
Чаво????
Сам-то сокращать дробишки умеешь? Ручками? как в третьем классе учили...
А!... Надо выделить целую часть? Попробуй сам решить этот вопрос. А то так ничему и не научишься.
И вывести должно совсем не то, что ты показал.
0
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
21.11.2017, 21:42  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Чаво????
Сам-то сокращать дробишки умеешь? Ручками? как в третьем классе учили...
А!... Надо выделить целую часть? Попробуй сам решить этот вопрос. А то так ничему и не научишься.
И вывести должно совсем не то, что ты показал.
Целая часть выводится с в строке, там где написано "Difference= 2 " ,остаток получается 7/8.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,918
21.11.2017, 22:07
Так тебе не дробь сократить надо а выделить дробную часть что ли?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.11.2017, 22:33
COKPOWEHEU, В стартовом посте все нормально записано.
Цитата Сообщение от fLur2017 Посмотреть сообщение
Вводятся числитель и знаменатель дроби. Вывести: знак, целую часть, сокращенные числитель и знаменатель.
Просто мы увлеклись сокращением, что конечно, интересно. Но с выделением целой чатси, я думаю, ТС сможет справится и сам. Или даже этот пустяк ему так сложен?
fLur2017, Тогда спрашивай. Попробуем помочь.
0
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
21.11.2017, 22:33  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Так тебе не дробь сократить надо а выделить дробную часть что ли?
Пользователь вводит a и b. Программа должна вывести знак(+ или -), целую часть после деления, и сокращённую дробь.
Пример: a=23 b=8.
Sign +
2 (целая часть) 7/8(дробная часть)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.11.2017, 22:37
Свои мозги, конечно, в твою голову не вставишь, но написать a/b можно.
0
0 / 0 / 0
Регистрация: 21.11.2017
Сообщений: 9
21.11.2017, 22:48  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Свои мозги, конечно, в твою голову не вставишь, но написать a/b можно.
Ты наверно не понимаешь, про что именно я спрашиваю. a/b выведет целую часть. А мне не понятно, как вывести дробную часть(остаток, как в моём вышеупомянутом примере- 7/8)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2017, 22:48
Помогаю со студенческими работами здесь

Программа которая запрашивает числитель и знаменатель правильной дроби и выделяет целую часть
Cоставьте программу которая запрашивает числитель и знаменатель правильной дроби и выделяет целую часть. Например: Числитель 17 ...

Даны две простые дроби числитель первой А, знаменатель В, числитель второй дроби С, знаменатель D.
Даны две простые дроби числитель первой А, знаменатель В, числитель второй дроби С, знаменатель D. Найти их сумму, и если можно сократить...

Отделить в дроби знаменатель от числителя
Доброго времени суток. Народ, подскажите плиз, как реализовать задачу - нужно отделить в дроби знаменатель от числителя и закинуть их...

Разбить строку с представлением дроби на числитель и знаменатель
Есть строка типа string с таким значением &quot;17/4&quot; или &quot;20/10&quot;. Как получить число до дроби и после в отдельные переменные? Встроенные...

Найти числитель и знаменатель несократимой правильной дроби
Даны натуральные M, N (M&gt;N). Найти числитель и знаменатель несократимой правильной дроби p/q такой, что p/q=m/n


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru