1

Project Euler Problem 14を解こうとしています。最長シーケンスを生成する 100 万未満の数を見つけるように求められます。私がしたことは、ベクトル v を作成し、その要素に特定の数のシーケンスの長さを入力することでした。したがって、位置 13 に存在する要素は、番号 13 によって生成されるシーケンスの長さに対応します。ただし、一見ランダムな要素のいくつかは非常に大きな数を取り、コードの何が問題なのかわかりません。また、1,000,000 でテストすると、完全に間違った答えが得られますが、手動でテストして検証した後、プログラムがいくつかの小さな数値で機能していることがわかります。

#include <iostream>
#include <vector>
using namespace std;

void find_longest(int n)
{
    int count = 1;
    int max = 0;
    int position;

    vector<int> v;
    v.push_back(0);
    v.push_back(0);

    for(int i = 1; i < n; i++)
    {
        long long int trainer = i;
        count = 1;
        while(trainer != 1)
        {
            if(trainer%2 == 0)
            {
                trainer /= 2;
                count++;
            }
            else
            {
                trainer = 3*trainer + 1;
                count++;
            }
        }
        v.push_back(count);
    }

    vector<int>::iterator it;

    for(it = v.begin(); it < v.end(); it++)
    {
        cout << v[*it] << endl;
        //if(v[*it] > max)
        //{
        //    max = v[*it];
        //    position = *it;
        //}
    }

    //cout << "The longest sequence is " << max << " terms long and is ";
    //cout << "generated by the number " << position << "." << endl;
}

int main()
{
    find_longest(100);
    //find_longest(1000000);
}
4

1 に答える 1

0

//型の不一致の変更を削除

ベクトル内の N 個の数値をすべて覚える必要はありません。必要なのは現在のシーケンスの長さだけです。次に、次の数値のシーケンスの長さを計算し、それが既に持っているものよりも大きい場合は、最大のものを保持します。

于 2012-08-18T18:57:19.620 に答える