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

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

21.11.2017, 11:01. Показов 5226. Ответов 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,910
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,910
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,910
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru