2017-04-16 10 views
1

私の3N + 1最長のシーケンスのこのコードのための最終的な出力を追跡していないことは...あなたは5を1を入力すると私のC++プログラムは

範囲の開始値と最も長いシーケンスです[ 1,5]は8個の要素を持つ。

代わりに{16個の要素}が得られます。

私の問題は私のカウンターシステムにあると思われ、返されます。どのように私はこれを修正することができますについてのアドバイスを誰も持っていますか?

#include <iostream> 

using namespace std; 
// Functions 
void getUserInput(int &start, int &end); 
int longestSequence(int minimum, int maximum); 
int getNextElement(int x); 
string generateSequence(); // still need to write definition 
int counter = 1; 

int main() 
{ 
    int minimum; 
    int maximum; 
    int last; 

    getUserInput(minimum, maximum); // 
    last = longestSequence(minimum, maximum); // starts longest sequence counter 

    cout << "The longest sequence with a start value in the range [" << minimum 
     << ", " << maximum << "] has " << last << " elements." << endl; 

    return 0; 
} 

void getUserInput(int &start, int &end) 
{ 
    cout << "Enter the min of the range for the sequence to start " << endl; 
    cin >> start; 
    cout << "Enter the max of the range for the sequence to start " << endl; 
    cin >> end; 
} 

int getNextElement(int x) // // This function does the 3n+1 computation 
{ 

    if (x != 1) // Checks for the end of the sequence. The end being when the number is 1. 
    { 
     counter++; 
     if (x % 2 == 0) // checks if its even 
      getNextElement(x/2); // takes the new number through the function again 
     else 
      getNextElement(x * 3 + 1); // takes the new number into the function again 
    } 
    cout << "This is in getNextElement" << counter << endl; 
    return counter; // this is returned as length in the longestSequence function. 
} 

int longestSequence(int minimum, int maximum) // this function compares all the sequence lengths within the range of minimum and maximum. 
{ 
    int max = 0; // Longest seqence 

    for (int i = minimum; i <= maximum; i++) 
    { 
     int length = getNextElement(i); // length is a temp that will hold the longest seqence 

     if (length > max) // this loop validates if the newest "length" from the sequence is bigger than the previous one 

      cout << "This is in the longest sequence loop ... length" << length 
       << endl; 
     cout << "This is in the longest sequence loop AS MAX" << length << endl; 
     max = length; // after the first run of the loop, max stores the longest seqence, and updates it after each run of the for loop if its longer 
     // counter = 1; not sure why this is here 
    } 
    cout << "This is in longest sequence.... max " << max << endl; 
    return max; 
} 
+0

コメントを重ねると、コードを難しくなく簡単に読むことができます。そして、このようなもの: '// Functions'は一種の侮辱です。 – user4581301

+1

'max = length; //ループの最初の実行後、maxは最長のseqenceを格納し、forループが実行されるたびにそれを更新します。ここで調査を開始してください。 – user4581301

+1

'//カウンタ= 1;なぜこれがここにあるのか分からないのですが、もう少し長く考えてください。真剣に言えば、あなたが先週本質的にこの質問をしたとき、あなたはもっと近づいていました。 – user4581301

答えて

3

int length = getNextElement(i)を呼び出す前に1に、あなたのカウンターをリセットします。 getNextElement(i)への各呼び出しは、最後の関数呼び出しが残っていたcounterから再開するため、出力として16が得られます。

counter=1; 
int length = getNextElement(i); 

それはチェックのためifの範囲外であるので、あなたが右の独自のコードでそれを逃しただけのよう

// counter = 1; not sure why this is here 

また、maxは大きい長さに更新しますが、任意の長されていませんより大きなもの。したがって、ifの条件に中括弧を入れて、max=lengthをその内部に移動します。

+0

@ user4581301ああ、中括弧がないことに気付かなかった。ありがとう –

+0

完璧!ありがとう、私はそれを試してみるつもりです –

関連する問題