在尝试解决Collat​​z问题时获得奇怪的结果

时间:2012-08-18 18:37:58

标签: c++ collatz

我正在尝试解决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);
}

1 个答案:

答案 0 :(得分:0)

//删除类型不匹配的更改

您无需记住矢量中的所有N个数字。 您所需要的只是当前序列长度。然后你计算下一个数字的序列长度,如果它比你已经大,你就保持最大的数字。