我正在尝试从史蒂文·S·斯基耶纳(Steven S.Skiena)和米格尔·A·雷维利亚(Miguel A.

但是我已经遇到了第一个挑战“3n + 1问题”的问题。

可以在这里找到挑战:http://www.programming-challenges.com/english/pdfs/110101.pdf

我的解决方案是。

#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

int CalcCycleLenght(int n)
{
    int t = 1;
    while (n != 1)
    {
        if (n % 2)
        {
            n = 3 * n + 1;
        }else{
            n = n / 2;
        }
        t++;
    }
    return t;
}

int main(int argc, char* argv[])
{
    int i;
    int j;
    vector<int> vi;
    vector<int> vj;
    vector<int> vm;

    int p = 0;

    while (scanf("%d %d", &i, &j) != EOF)
    {
        vi.push_back(i);
        vj.push_back(j);
        int max = 0;
        int n;
        for (int t = i; t <= j; t++)
        {
            n = CalcCycleLenght(t);
            if (n > max)
                max = n;
        }
        vm.push_back(max);
    }

    for (int i=0; i < vi.size(); i++)
    {
        printf("%d %d %d \n", vi[i], vj[i], vm[i]);
    }

    return 0;
}

它可以正确编译(尽管我认为我还有一个include),并且根据示例输入和输出,答案是正确的。但是在线法官说“答案错误”。我认为我的问题是输入或输出数字的方式。

[编辑]

我解决了。似乎问题是有时我比j大。我还删除了 vector ,并使代码更有效。这是新的主要功能。
int main(int argc, char* argv[])
{
    int i;
    int j;

    int a;
    int b;

    int max;
    int p;

    while (scanf("%d %d", &i, &j) != EOF)
    {
        if (i < j)
        { a = i; b = j; }
        else
        { a = j; b = i; }

        max = 0;
        for (int t = a; t <= b; t++)
        {
            p = CalcCycleLenght(t);
            if (p > max)
                max = p;
        }
        printf("%d %d %d\n",i,j,max);
    }
    return 0;
}

谢谢

最佳答案

您在每行的末尾输出一个额外的空格。尝试删除此空间,因为自动判断通常在此类情况下会失败。除此之外,您的算法对我来说看起来是正确的。

顺便说一句,没有理由将数字放入 vector 中-您可以在计算它们时只输出每一行的结果。

编辑:从规范中尚不清楚i>j是否可能。在这种情况下,您的代码将输出0,因此,如果删除空格没有帮助,您可以尝试在这种情况下交换ij,以便获得有意义的输出(只需确保以与您相同的顺序输出ij抓到他们了)。

编辑2 :这很可能是问题所在:您在计算中使用了int,在大多数平台上,它最多可以存储2147483647的值。但是,计算循环长度将需要大于该数字的数字(例如,对于初始值113383)。如果使用long long(假设支持),则应该可以。

关于c++ - 帮助编程挑战,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6629802/

10-11 21:06