Вычисление одинаковых цифр числа. Код есть, он работает. Но вылетает при использовании больших чисел

366
13 октября 2021, 17:10

Учу С++ самостоятельно, вот решил написать программу, которая определяет, есть ли повторяющиеся цифры в числе. Чтобы усложнить себе жизнь, добавил условие "вывести каждый вид числа". Вот итоговый код.

Вопрос в том, что консоль виснет и вылетает, при вводе чисел более 5 знаков. Предполагаю, это из-за множества циклов, но может я что-то неправильно сделал с динамическими массивами. Кстати, удалить я их не могу до конца программы.

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

string s;
int j = s.length();
int* nums = new int[j];
int* eq = new int[j];

int destroy(int num) //Разбивает число на цифры, записывая их в массив "nums".
{
    int f = 0;
    int d = 0;
    string s = to_string(num);
    for (int k = s.length() - 1; k >= 0; k--)
    {
        f = pow(10, k);
        nums[d] = num / f % 10;
        d++;
    }
    return 0;
}
int main()
{
    setlocale(LC_ALL, "Russian");
    int num = 0;
    int x = 0;
    bool b = false;
    bool a = false;
    cin >> num;
    string s = to_string(num);
    j = s.length();
    destroy(num);
    for (int i = 0; i <= j - 1; i++)
    {
        for (int l = i + 1; l <= j + 1; l++)
        {
            if (nums[i] == nums[l])  // Проверяет, есть ли вообще повторы цифр.
            {
                a = true;
                for (int k = 0; k <= j + 1; k++)
                {
                    if (nums[i] == eq[k]) // Если есть повторы, проверяет, совпадает ли повтор с уже известными.
                    {
                        b = true;
                    }
                }
                if (b == false) // Если нет совпадений с уже известными повторами, добавляет число в этот массив.
                {
                    eq[x] = nums[i];
                    x++;
                }
                b = false;
            }
        }
    }
    if (a == true) // Подтверждение, что есть повторы.
    {
        cout << "В этом числе повторяются цифры: " << endl;
        for (int i = 0; i <= x - 1; i++)
        {
            cout << eq[i] << " ";
        }
    }
}
Answer 1

"Динамичность" Ваших массивов сильно преувеличена. Как Вы думаете, чему здесь равно j?

string s;
int j = s.length();
int* nums = new int[j];
int* eq = new int[j];

В этом месте (new int[j]) j равно нулю. Вы пишете за границы этих массивов. Перенесите выделение памяти в то место, где уже известна длина введеной строки.

Теперь Вы понимаете, почему

виснет и вылетает, при вводе чисел более 5 знаков

Присваивая значения элементам массивов, Вы портите память.

READ ALSO
c++ push_back правильно ли написал?

c++ push_back правильно ли написал?

у меня все работает хорошо, но в arr[0] где то присваивается 0Поэтому я пишу в PrintArray int i = 1

264
перегрузка operator+ c++

перегрузка operator+ c++

я написал перегрузку оператора+ для класса Dinamic:

203