#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, массив имеет 5int
сек с индексами 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;
}