Разные значения для одного и того же элемента массива? - PullRequest
0 голосов
/ 04 июня 2018

Так что я не уверен, что здесь происходит.

У меня есть функция, которая должна решить эту проблему, за исключением того, что при наборе элементов массива вmain () Я получаю разные результаты:

  • 0, если я нахожу его в одной строке с функцией
  • правильный результат, если я выписываю его ниже

Вот код:

#include <bits/stdc++.h>

using namespace std;

int a[100100],mx=0,bg;

int collatz(int n){
    a[1] = 1;
    for(int i=2; i<=n; i++){
        int p = 0;
        int j=i;
        while(j!=1 && j>=i){
            if(j%2==0) j/=2, p++;
            else if(j%2==1) j=3*j+1, 
        }
        a[i] = p + a[j];
        if(mx<a[i]) mx = a[i], bg = i;
    }
    return mx;
}

int main()
{
    for(int i=1; i<=10000; i++) a[i] = 0;
    cout << collatz(1000) << " " << a[1] << " " << a[2] << " " << a[3]<< "\n";
    cout << a[1] << " " << a[2] << " " << a[3] << " ";
    return 0;
}

И вот что я получаю:

enter image description here

Компилятор, который я использую - это CodeBlocks,хотя я проверял это на других, и это та же проблема!

Спасибо

1 Ответ

0 голосов
/ 05 июня 2018

В строке:

 cout << collatz(1000) << " " << a[1] << " " << a[2] << " " << a[3]<< "\n";

До появления стандарта C ++ 17 компилятору было разрешено оценивать операнды в любом порядке, поэтому он мог искать a[1] и т. Д. И сохранять результат., затем вызовите collatz(1000), а затем отобразите сохраненные результаты в правильном порядке.

Чтобы это исправить, либо скомпилируйте в режиме C ++ 17 (используйте -std=c++17 переключатель компилятора), либо измените код на:

cout << collatz(1000);
cout << " " << a[1] << " " << a[2] << " " << a[3]<< "\n";
...