Как я пропускаю последний элемент массива

#c #data-structures

#c #структуры данных

Вопрос:

Я столкнулся с проблемой

 #include<iostream>
using namespace std;
bool check(int input)
{
    int count = 0;
    int temp;
    int val[] = { 2,0,2,1 };
    temp = input;
    while (temp != 0) {
        count  ;
        temp /= 10;
    }
    int *arr = new int[count];
    for (int i = count; i >= 0; i--)
    {
        arr[i] = input % 10;
        input /= 10;
    }
    temp = 0;
    int res = count;
    for (int j = 0; j < 5; j  )
    {
        for (int k = 0; k < res; k  )
        {
            if (val[j] == arr[k])
            {
                cout << "CHECKING : " << arr[k] << endl;;
                j = j   1;
                for (int l = k; l < (count - 1); l  )
                {
                    arr[l] = arr[l   1];
                }
                res=res-1;
                temp  ;
                k = 0;
                if (temp == 4)
                {
                    return true;
                }
            }
        }
    }
    cout << temp;
    return false;
}
int main()
{
    int input;
    cin >> input;
    if (check(input) == true)
    {
        cout <<endl << "YES!!" << endl;
    }
    else
    {
        cout <<endl <<"NO!!" << endl;
    }
}
  

в этой программе я должен проверить, есть ли у входного номера номер 2021 или нет, если ввод 2002021, вывод должен быть yes или ввод 2002024, вывод должен быть no, потому что 1 (2021) отсутствует. теперь дело в том, что моя программа логически работает нормально, но я не знаю, как отсутствует последний элемент моего массива, например, если япоместите 200022021 = тогда результат будет no, но если я даю 200022012, он говорит «да», я не знаю, как отсутствует мой последний элемент массива.

Комментарии:

1. Если вы new int[count] используете самый высокий индекс, к которому вы можете получить доступ в этом новом массиве count - 1 . Если count равно 5, массив имеет 5 int сек с индексами 0, 1, 2, 3 и 4. Делая arr[i] то, где i == count у вас неопределенное поведение.

2. for (int j = 0; j < 5; j ) должно быть for (int j = 0; j < 4; j ) . Вероятно, вам следует убедиться, что здесь j < 4: if (val[j] == arr[k])

3. j = 4 * исправлено, но все та же проблема

Ответ №1:

Вы неправильно указали счетчик циклов:

 for (int i = count; i >= 0; i--)
{
    arr[i] = input % 10;
    input /= 10;
}
  

На первой итерации i == count и arr[count] выходит за рамки. Последняя итерация i == 1 (потому что, когда (i >= 0) == false вы останавливаете цикл), и вы никогда не присваиваете arr[0] .

Вы можете вызвать историю таких ошибок, когда используете либо std::vector или std::array (для динамического / фиксированного размера, соответственно) и используете их обратные итераторы ( rbegin и rend ) для повторения всех элементов в обратном порядке.

Ответ №2:

Просто потому, что я не могу беспокоиться о поиске ошибки:

Вы можете использовать тот же метод, что и для разделения отдельных цифр, чтобы просмотреть число в группах по четыре цифры.

x % 10 — последняя цифра; x % 100 — последние две цифры; x % 1000 — последние три цифры и так далее.
Добавьте деление на 10, чтобы «сдвинуть» число:

 bool check(int input)
{
    while (input > 2020)
    {
        if (input % 10000 == 2021)
        {
            return true;
        }
        input /= 10;
    }
    return false;
}