int main() {
int m;
cin >> m;
int len = 0;
if (m <= 1) {
cout << m << endl;
return 0;
} else {
int a[] = {
0,
1
};
for (int i = 2; i <= m * m; ++i) {
cout << "second" << m << " " << m * m << endl;
a[i] = (a[i - 2] + a[i - 1]) % m;
cout << m << " " << m * m << endl;
if (a[i] == 1 && a[i - 1] == 0) {
len = i - 1;
break;
}
}
}
cout << len << endl;
return 0;
}
Выход
2
second2 4
1 1
0
Я сохраняю ввод в переменную m (в примере входное значение равно 2). Однако после утверждения a[i] = (a[i-2]+a[i-1])%m;
значение m становится равным 1. Не происходит никакого уменьшения или чего-то еще, что могло бы вызвать это?
Откуда вы знаете, что значение m становится равным 1? Значение m остается постоянным -> cpp.sh/7ep3li
Массив a
состоит только из 2 элементов, поэтому запись (и чтение) в a[2]
и выше не разрешена.
Вы должны использовать std::vector для динамического добавления элементов в массивы.
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
int main() {
int m;
cin>>m;
int len=0;
if (m<=1) {
cout<<m<<endl;
return 0;
}
else {
std::vector<int> a = {0,1}; // initializer list, which is supported in C++11 and later
for(int i=2; i <= m*m; ++i) {
cout<<"second"<<m<<" "<<m*m<<endl;
a.push_back((a[i-2]+a[i-1])%m); // use push_back to add elements
cout<<m<<" "<<m*m<<endl;
if (a[i]==1 && a[i-1]==0) {
len=i-1;
break;
}
}
}
cout<<len<<endl;
return 0;
}
Это сработало! Я должен был это видеть. Однако я не понимаю, как это повлияет на значение m.
Помимо очевидной ошибки, сделанной OP (которая, как вы указали, является реальной проблемой), столкновение с «ошибкой» OP - значение m изменений - не может быть воспроизведено (и не должно быть воспроизведено в первую очередь). Я отмечаю это как невоспроизводимое, потому что я не получаю тот же результат, что и OP.
@ d4rk4ng31 Неопределенное поведение вызывается при доступе за пределами диапазона. Поведение не обязательно должно быть одинаковым во всех средах.
Да, но не будет ли это поведение «влиять» только на переменные, вызывающие неопределенное поведение? Как можно повлиять на m, инициализированную переменную, полностью отделенную от массива?
@ d4rk4ng31 Нет. UB означает то, что он говорит, это неопределенное поведение. Абсолютно все в вашей программе может пойти не так.
Причиной этого является тот факт, что ваш массив имеет размер два, но вы относитесь к нему так, как если бы он был намного больше.