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

Не могу сократить дробь при слишком больших значениях числителя и знаменателя

05.07.2023, 17:28. Показов 1011. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте при слишком больших значениях числителя и знаменателя (a и b) не могу сократить дробь. Цикл не выполняется чтоли. я числитель и знаменатель раскладываю на простые числа и ищу общие. если нахожу то каждое(и числитель и знаменатель) делю на это число. делал int и long. Это не помогает. Помогите пожалуйста как сократить если числитель и знаменатель большие числа.

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
#include <iostream>   
#include<cstdlib>     
#include <stdio.h>     
#include <iomanip>     
#include<ctype.h>     
#include< conio.h >    
#include< cmath >   
using namespace std;
 
 
 
 
int main()
{
    long a = -2566;
    long b = 56784;
 
    long i;
 
 
again:
    for (i = 2; i <= b; i++)
    {
        bool ch = true;
        for (long j = 2; j <= i - 1; j++)
        {
            if (i % j == 0) { ch = false; }
        }
 
        if (ch == true && a % i == 0 && b%i==0)
 
        {
 
            a = a / i;
            b = b / i;
            goto again;
 
        }
 
    }
    cout << a << " " << b;
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2023, 17:28
Ответы с готовыми решениями:

Структура «дробь» состоит из 2 целых полей, числителя и знаменателя
&quot;С#&quot;Структура «дробь» состоит из 2 целых полей, числителя и знаменателя. Реализовать методы выделения дробной части (9/4 – &gt;0,25...

Опишите объект «обыкновенная дробь» с методами «НОД числителя и знаменателя», «сокращение»
Дана преподавателем программа, а при вводе она не работает, выдает ошибку((((( Очень нужна помощь того, кто в этом понимает!!!! ...

Найти наибольшую правильную несократимую дробь, у которой сумма числителя и знаменателя равна N
Дробь называется правильной, если ее числитель меньше знаменателя, и несократимой, если числитель и знаменатель являются взаимно простыми....

17
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,180
05.07.2023, 17:38
Цитата Сообщение от sima3 Посмотреть сообщение
при слишком больших значениях числителя и знаменателя (a и b) не могу сократить дробь.
Что значит "не могу" и что такое "слишком большие"? О чем речь вообще?
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
05.07.2023, 17:40  [ТС]
а - числитель.
b - знаменатель.
Вот которые сейчас сокращает нормально.
но если сделать значение например b больше тоесть знаменатель. то программа не завершается ничего не происходит
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,180
05.07.2023, 17:40
Цитата Сообщение от sima3 Посмотреть сообщение
Это не помогает.
Не помогает от чего? В чем проблема?
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
05.07.2023, 17:41  [ТС]
скпируйте пожалуйста мой код. и попробуйте выполнить при знаменателе равном например 679593
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,180
05.07.2023, 17:41
Цитата Сообщение от sima3 Посмотреть сообщение
но если сделать значение например b больше тоесть знаменатель. то программа не завершается ничего не происходит
Ну так где конкретные входные данные, а которых "ничего не происходит". Покажите пальцем, где вы их привели.
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
05.07.2023, 17:42  [ТС]
long a = -2566; числитель
long b = 56784; знаменатель
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,180
05.07.2023, 17:53
Цитата Сообщение от sima3 Посмотреть сообщение
long a = -2566; числитель
long b = 56784; знаменатель
Не понял. Что вы хотели этим комментарием? На таких данных программа прекрасно выполняется. И дает ответ

-1283 28392

Цитата Сообщение от sima3 Посмотреть сообщение
и попробуйте выполнить при знаменателе равном например 679593
Так при знаменателе 56784 или при знаменателе 679593?

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

-2566 679593
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
05.07.2023, 17:55  [ТС]
это потому что комп слабоват?)

Добавлено через 1 минуту
long a = -2566; числитель
long b = 56784; знаменатель
при этих выполняется.
но если
long a = -2566; числитель
long b = 56784564; знаменатель
то жду минут 10 не происходит ничего
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,180
05.07.2023, 18:00
Цитата Сообщение от sima3 Посмотреть сообщение
long a = -2566; числитель
long b = 56784; знаменатель
при этих выполняется.
Так а в чем тогда цель поста #7?

Цитата Сообщение от sima3 Посмотреть сообщение
то жду минут 10 не происходит ничего
Что написали, то и получили. Ждать придется долго.

То есть программа прекрасно "работает". Зачем вы нам тогда рассказывали сказки про "цикл не выполняется" и "ничего не происходит"?

Цитата Сообщение от sima3 Посмотреть сообщение
Помогите пожалуйста как сократить если числитель и знаменатель большие числа.
Не страдать фигней, а найти НОД алгоритмом Евклида.
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
05.07.2023, 18:02  [ТС]
ну удалите тему тогда. я только начинаю учить. что понтуетесь?
0
06.07.2023, 05:42

Не по теме:

Цитата Сообщение от sima3 Посмотреть сообщение
что понтуетесь?
Понтанулся знакомством с Евклидом... Не каждый день выпадает возможность

0
70 / 14 / 4
Регистрация: 10.07.2018
Сообщений: 308
09.07.2023, 22:55
Assembler
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
section .data
    a dd -2566
    b dd 56784
     
section .text
    global _start
    
_start:
    ; Инициализация переменных
    mov eax, dword [a]
    mov ebx, dword [b]
    
again:
    ; Инициализация цикла for(i = 2; i <= b; i++)
    mov ecx, 2
    
for_i:
    ; Инициализация переменной ch
    mov edx, 1
    
    ; Инициализация цикла for(j = 2; j <= i - 1; j++)
    mov esi, 2
    
for_j:
    ; Проверка условия i % j == 0
    xor edx, edx
    mov eax, ecx
    mov ebx, esi
    div ebx
    
    ; Условная инструкция для выхода из цикла
    cmp edx, 0
    jz end_for_j
    
    ; Увеличение j
    inc esi
    cmp esi, ecx
    jle for_j
    
end_for_j:
    ; Проверка условия ch && a % i == 0 && b % i == 0
    cmp edx, 1
    jne end_for_i
    
    mov eax, dword [a]
    mov ebx, ecx
    cdq
    idiv ebx
    cmp edx, 0
    jnz end_for_i
    
    mov eax, dword [b]
    mov ebx, ecx
    cdq
    idiv ebx
    cmp edx, 0
    jnz end_for_i
    
    ; Обновление переменных a и b
    mov dword [a], eax
    mov dword [b], ebx
    
    ; Пропуск цикла
    jmp again
    
end_for_i:
    ; Вывод результата
    push eax
    push ebx
    push format
    call printf
    add esp, 12
    
    ; Завершение программы
    mov eax, 0
    ret
    
section .data
    format db "%d %d", 10, 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
#include <iostream>   
using namespace std;
     
int main()
{
    long long a = -2566;
    long long b = 56784;
 
    long long i;
     
again:
    for (i = 2; i <= b; i++)
    {
        bool ch = true;
        for (long long j = 2; j <= i - 1; j++)
        {
            if (i % j == 0) {
                ch = false;
                break;
            }
        }
 
        if (ch && a % i == 0 && b % i == 0)
        {
            a = a / i;
            b = b / i;
            goto again;
        }
    }
     
    cout << a << " " << b;
     
    return 0;
}
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 67
09.07.2023, 22:58  [ТС]
Спасибо вам. Я уже сделал возможно коряво, но как смог. Это задание для сложения двух дробей.

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <iostream>    
#include < conio.h >    
#include <iomanip>    
#include <string>   
using namespace std;
 
int main()
{
    
    ////////////////////////////////// drob 1
    cout << "Enter drob 1: ";
    char ch;
    int zeloe1, chislitel1, znamenatel1;
    cin >> zeloe1 >> chislitel1 >> ch >> znamenatel1;
    ////////////////////////////////
 
    ///////////////////////////////////////////// sdelat neppr 1 drob
 
    if (zeloe1 < 0)
    {
        zeloe1 = abs(zeloe1);
        chislitel1 = (-1) * (znamenatel1 * zeloe1 + chislitel1);
        zeloe1 = 0;
    }
    if (zeloe1 > 0)
    {
        chislitel1 = znamenatel1 * zeloe1 + chislitel1;
        zeloe1 = 0;
 
    }
 
    ///////////////////////////////////////////////
 
    ////////////////////////////////////////////// drob2
    cout << "Enter drob 2: ";
    int zeloe2, chislitel2, znamenatel2;
    cin >> zeloe2 >> chislitel2 >> ch >> znamenatel2;
    /////////////////////////////////////////////
 
    ///////////////////////////////////////////// sdelat neppr 2 drob
 
    if (zeloe2 < 0)
    {
        zeloe2 = abs(zeloe2);
        chislitel2 = (-1) * (znamenatel2 * zeloe2 + chislitel2);
        zeloe2 = 0;
    }
    if (zeloe2 > 0)
    {
        chislitel2 = znamenatel2 * zeloe2 + chislitel2;
        zeloe2 = 0;
 
    }
 
    ///////////////////////////////////////////////
 
 
 
 
 
    /////////////////////////////////////////////////////////////// summa
    int zeloe3 = 0, chislitel3, znamenatel3;
    chislitel3 = chislitel1 * znamenatel2 + chislitel2 * znamenatel1;
    znamenatel3 = znamenatel1 * znamenatel2;
    //////////////////////////////////////////////////////////////
 
    ////////////////////////////////////////////////////////////////////////////////////////////////// socratit obchuu drob
 
 
    if (chislitel3 % znamenatel3 == 0)
    {
        zeloe3 = chislitel3 / znamenatel3;
        chislitel3 = 0;
        znamenatel3 = 1;
         cout << zeloe3 << " " << chislitel3 << "/" << znamenatel3;
        return 0;
    }
    else
    {
        //////////////////////////////// otriz chislitel block
        if (chislitel3 < 0)
        {
            chislitel3 = chislitel3 * (-1);
 
            if (chislitel3 > znamenatel3)
            {
                zeloe3 = (chislitel3 - chislitel3 % znamenatel3) / znamenatel3;
                chislitel3 = chislitel3 % znamenatel3;
                int c;
                int a_t, b_t, b_t_t;
                a_t = chislitel3;
                b_t = znamenatel3;
                do
                {
                    c = a_t % b_t;
                    a_t = b_t;
                    b_t_t = b_t;
                    b_t = c;
 
                } while (b_t != 0);
                chislitel3 = chislitel3 / b_t_t;
                znamenatel3 = znamenatel3 / b_t_t;
 
 
                zeloe3 = zeloe3 * (-1);
                 cout << zeloe3 << " " << chislitel3 << "/" << znamenatel3;
                return 0;
            }
 
            if (chislitel3 < znamenatel3)
            {
                zeloe3 = 0;
                chislitel3 = chislitel3 % znamenatel3;
 
 
 
 
                int c;
                int a_t, b_t, b_t_t;
                a_t = chislitel3;
                b_t = znamenatel3;
                do
                {
                    c = a_t % b_t;
                    a_t = b_t;
                    b_t_t = b_t;
                    b_t = c;
 
                } while (b_t != 0);
                chislitel3 = chislitel3 / b_t_t;
                znamenatel3 = znamenatel3 / b_t_t;
                chislitel3 = chislitel3 * (-1);
                 cout << zeloe3 << " " << chislitel3 << "/" << znamenatel3;
                return 0;
            }
 
        }
        ///////////////////////////////////////////////////////////////////
 
 
 
 
                //////////////////////////////// polozhitelnyy chislitel block
        if (chislitel3 > 0)
        {
 
            if (chislitel3 > znamenatel3)
            {
                zeloe3 = (chislitel3 - chislitel3 % znamenatel3) / znamenatel3;
                chislitel3 = chislitel3 % znamenatel3;
                int c;
                int a_t, b_t, b_t_t;
                a_t = chislitel3;
                b_t = znamenatel3;
                do
                {
                    c = a_t % b_t;
                    a_t = b_t;
                    b_t_t = b_t;
                    b_t = c;
 
                } while (b_t != 0);
                chislitel3 = chislitel3 / b_t_t;
                znamenatel3 = znamenatel3 / b_t_t;
                 cout << zeloe3 << " " << chislitel3 << "/" << znamenatel3;
                return 0;
 
            }
 
            if (chislitel3 < znamenatel3)
            {
                zeloe3 = 0;
                chislitel3 = chislitel3 % znamenatel3;
                int c;
                int a_t, b_t, b_t_t;
                a_t = chislitel3;
                b_t = znamenatel3;
                do
                {
                    c = a_t % b_t;
                    a_t = b_t;
                    b_t_t = b_t;
                    b_t = c;
 
                } while (b_t != 0);
                chislitel3 = chislitel3 / b_t_t;
                znamenatel3 = znamenatel3 / b_t_t;
                 cout << zeloe3 << " " << chislitel3 << "/" << znamenatel3;
                return 0;
            }
        }
        ///////////////////////////////////////////////////////////////////
    }
 
 
    
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.07.2023, 16:23
sima3, 1. Почему ты думаешь, что комментарии типа "/////////////" и куча пустых строк делает код более читабельным. Могу тебя уверить, что это не так. Настолько, что лично я его прочесть не смог. Задремал
2. Все очень просто и делается совсем не так. Ищется НОД по улучшенному алгоритму Эвклида. Как сделал ты, я не знаю, по вышеуказанной причине.
В любом случае задаче не стоит двухсот строк кода, даже с учетом того, что половина из них дурные комментарии и пробельные

Добавлено через 6 минут
Цитата Сообщение от Юг Посмотреть сообщение
ну или можно так написать
Ассемблера я, увы, не знаю. Но то, что ты написал на Си настолько чудовищно, что для таких кодов пора создать комнату смеха новичкам в урок и на потеху.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
10.07.2023, 16:32
Вот так?
Миниатюры
Не могу сократить дробь при слишком больших значениях числителя и знаменателя  
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.07.2023, 16:49
Ну, если уж так уж приспичило раскладывать на простое, то это можно сделать примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main() {
  long a, b;
  cin >> a >> b;
  long x = a;
  for(long d = 2; d*d <= x; d++) )
    while (x%d==0) {
       x /= d;
       if (b%d==) {
          a /= d;
          b /= d;
       }
   }
   // Цикл гарантирует, что все делители d  будут простыми
   if {x > 1 && b%x==0) {
      a /= x;
      b /= x;
   }
   cout << a << " " << b;
}
Возню со знаками я опустил
На это все, конечно, много хуже нахождения НОД через Эвклида
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
10.07.2023, 17:05
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned long long nodd(unsigned long long a, unsigned long long b)
{
    unsigned long long c;
 
    // выполнять пока (b != 0)
    while(b)
    {
        c = a % b;
        a = b;
        b = c;
    }
 
    return a;
}
Вот функция нахождения НОД. По-моему a должно быть больше b, но это не точно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2023, 17:05
Помогаю со студенческими работами здесь

Определение числителя и знаменателя дня недели
Доброго времени суток, есть такая задачка дан день начала учебы и день окончания учебы, и произвольный день в этом периоде, определить в...

Сравнить значения числителя и знаменателя дроби
Условие в картинке

Программа разделения числителя и знаменателя на простые множители
3. дано два целых плюсових числа n i m. извесно что n i m есть числителемс и знаменателем какогото дроба. Зделать програму разделения...

Найти наибольший общий делитель числителя и знаменателя
Даны натуральные числа a и b, которые образуют правильную обыкновенную дробь a b . Попытаться сократить дробь, т.е. найти...

Написать структуру дробные числа числителя (целое число) и знаменателя >0
Помогите пожалуйста решить. Написать структуру дробные числа числителя (целое число) и знаменателя &gt;0. И сделать все операции с ними +,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru