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

Код не работает при больших числах

28.11.2022, 20:28. Показов 1285. Ответов 6

Студворк — интернет-сервис помощи студентам
Написал код нахождения простых множителей длинных чисел. В функции (function) поставил цикл - пока делитель не больше входного числа - искать простой множитель. Для этого перевожу постоянно делитель в массив, чтобы сравнить с входным числом (функция maximum). Код отличном работает с небольшими числами (около 100 миллионов), но когда вводишь огромное число (от 10 цифр) код начинает стопариться и НЕ ВЫХОДИТ из цикла, складывается чувство, что сравнение работает как-то неправильно, но с небольшими числами код почему-то работает.


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
#include <iostream>
#include <algorithm>
#include <string>
#include <array>
using namespace std;
 
void string_to_int(string s, int* mas) //перевод строки в массив
{
    int i, j;
    for (i = 0, j = s.length() - 1; i < s.length(), j >= 0; i++, j--) { //перевод строки в число, даны i, j
        mas[i] = s[j] - 48;
    }
}
void print_number(int* mas, int n) //выводим массив на экран
{
    int i = n - 1;
    while (mas[i] == 0) i--;
    for (; i >= 0; i--)
        cout << mas[i];
}
 
void zero_mas(int* mas, int n) //обнуление массива
{
    for (int i = 0; i < n; i++)
        mas[i] = 0;
}
 
int countDigit(int& number) //функция поиска сколько символов в div
{
    int length = 0;
    int tmp = number;
    while (tmp > 0)
    {
        tmp = tmp / 10;
        length++;
    }
    return length; //возвращаем длинну числа
}
 
int maximum(int* x, int len_x, int* proverka,int div) //функция сравнения двух длинных чисел
{
    int length = countDigit(div); //запускаем функцию поиска длинны простого делителя
    zero_mas(proverka, length); //обнуляем массив div
    for (size_t i = 0; i < length; i++)
    {
        proverka[i] = div % 10;
        div /= 10;
    }
    int k = 3;
    for (int i = len_x - 1; i >= 0; i--)
    {
        if (x[i] > proverka[i]) //если массив числа больше массива делителя, то выводим 1
        {
            k = 1;
            break;
        }
        if (x[i] < proverka[i]) //если массив числа больше массива делителя, то выводим 2
        {
            k = 2;
            break;
        }
    }
    return k;
}
 
void function(int* arr, int len_x, int* itog, int* proverka) {
    string res = "";
    int div = 2, r = 0;//div - простой делитель, r - остаток от деления
    while (maximum(arr, len_x, proverka, div) == 1) { //запускаем функцию сравнения двух длинных чисел
        for (int i = len_x - 1; i >= 0; i--)
        {
            r = r * 10 + arr[i]; //проверяем число на делимость без остатка
            itog[i] = r / div;
            r = r % div;
        }
        if (r == 0) { //если остаток 0, то даем значения элементов промежуточного массива - основному массиву
            for (int j = len_x - 1; j >= 0; j--) {
                arr[j] = itog[j];
            }
            res += to_string(div) + "*"; //даем переменной res простые множители
           // cout << div << "*";
        }
        else { //если остаток больше 0, то
                r = 0; //обнуляем остаток
                div += 1; //увеличиваем делитель на 1
                for (int x = len_x - 1; x >= 0; x--) { //возвращаем промежуточному массиву значения массива предыдущего шага
                    itog[x] = arr[x];
                }
            }
        }
    if (res == "") { //если множитель сразу простой, то выводим только его
        res += to_string(div);
    }
    res.pop_back(); //выводим все простые множители, удалив последние *
    cout << res;
    }
 
// возвращает true если в строке беззнаковое целое
bool isUint(const string& s) { //проверка ввода на число, а не буквы
    return s.find_first_not_of("0123456789") == string::npos;
}
 
 int main() {
    string str; // вводим переменную строки
    int* arr, * itog, n, n3, * proverka; //arr - наш массив, itog - промежуточный массив, n и n3 - кол-во элементов в массивах
    do
    {
        cout << "Long int number: "; //проверка ввода на число, а не буквы
        cin >> str;
        if (str.empty())
            break;
        cout << "Is " << (isUint(str) ? "" : "NOT ") << "a number." << std::endl;
    } while (isUint(str) != 1);
 
 
    n = str.length(); // n - длина строки
    n3 = n;
    proverka = new int[n]; //массив, для проверки div (больше ли он, чем наше число)
    arr = new int[n]; //основной массив
    itog = new int[n3]; //промежуточный массив
    string_to_int(str, arr); //конвертируем строку в длинное число (массив)
    zero_mas(itog, n3); //обнуляем промежуточный массив
    print_number(arr, n); //выводим массив на экран
    cout << " = ";
    function(arr, n, itog, proverka); //подключаем функцию
    return 0;
}
Миниатюры
Код не работает при больших числах   Код не работает при больших числах  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2022, 20:28
Ответы с готовыми решениями:

Реверс введенного числа некорректно работает при больших числах
Написала код для реверса введенного числа, но при вводе числа 11 или более -значного числа компилятор выводит 746384712. Пожалуйста,...

Неправильный подсчёт арифметической прогрессии при больших числах
Доброго времени суток. Есть олимпиадная задачка. Суть такова: есть множество чисел от L до R, и надо посчитать сколько есть таких пар в...

Почему рекурсия прерывает работу программу при больших числах?
Добрый вечер. Подскажите пожалуйста, почему рекурсия прерывает работу программу, если например m я ввожу свыше 4500. Это выражение в...

6
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
28.11.2022, 20:47
int - это 31 бит числа + знак.
Числа какой ширины тебе нужны?
0
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 24
28.11.2022, 20:49  [ТС]
У меня задание, связанное с длинной арифметикой, через массив
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
29.11.2022, 01:39
Цитата Сообщение от Drrroqp Посмотреть сообщение
У меня задание, связанное с длинной арифметикой, через массив
Так а почему вы решили что в вашей арифметике простые делители поместятся в тип int?

Также: в функции maximum в массиве proverka[] после индекса length содержится мусор. Вы сравниваете этот мусор с элементами массива x[]. Какого результата вы ожидаете от такого сравнения?

Цитата Сообщение от Drrroqp Посмотреть сообщение
Код отличном работает с небольшими числами (около 100 миллионов),
Нет, код не работает ни с какими числами из-за этого сравнения с мусором. Вам показалось, что код "работает" из-за каких-то случайных совпадений.
0
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 24
30.11.2022, 00:34  [ТС]
Как мне тогда сделать "Пока в массиве не останется последний элемент 1, а остальные нули?" Ну в общем пока число не равно 1.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.11.2022, 01:37
Цитата Сообщение от Drrroqp Посмотреть сообщение
"Пока в массиве не останется последний элемент 1, а остальные нули?"
Почему там должны быть нули ?
0
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 24
30.11.2022, 21:29  [ТС]
Ну поиск простых множителей обычного числа считается так, что while number >1. Но мне надо перевести этот цикл для длинной арифметики. Я думал, что это значит, что пока все элементы кроме последнего равны 0, а последний 1.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2022, 21:29
Помогаю со студенческими работами здесь

RSA-шифрование. Зависает при больших числах P и Q. Как исправить?
Есть программа на C#, которая шифрует текст методом RSA. Но преподаватель требует в качестве P и Q использовать числа в несколько...

Объясните почему этот код работает не верно при больших значениях
#include &lt;inttypes.h&gt; unsigned long long int rowSumOddNumbers(uint32_t n) { unsigned long long int a; a = n*n*n; ...

Включение сегмент точки при числах больше «5» и отключение при числах меньше «5»
Дополните схему и программу таким образом, чтобы сегмент-точка включался при числах больше «5» и отключался при числах меньше «5». ...

Отступы в больших числах
как правильно форматнуть вывод например числа 2355129 в примерно такой вид 2 355 129. что бы число лучше читалось пользователем и...

Уравнение. Реализовываю ЭЦП Эль- Гамаля на больших числах
Реализовываю ЭЦП Эль- Гамаля на больших числах. На последнем этапе столкнулся с проблемой. Как программно посчитать s ?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru