帮助编程挑战

时间:2011-07-08 19:58:32

标签: c++

我正试图从Steven S. Skiena和Miguel A. Revilla的书中编写编程挑战。

但我已经遇到了第一个被称为“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;
}

它正确编译(虽然我认为我有一个额外的包含),并且根据示例输入和输出答案是正确的。但网上法官说“错误答案”。我认为我的问题是我输入或输出数字的方式。

[编辑]

我解决了它。似乎问题是有时候我比j大。我还删除了向量并使代码更有效。这是新的主要功能。

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;
}

由于

3 个答案:

答案 0 :(得分:3)

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

顺便说一下,没有理由把数字放在向量中 - 你可以在计算时输出每一行的结果。

修改:规范中不清楚i>j是否可能。在这种情况下,您的代码会输出0,因此如果删除空格无效,您可以尝试在这种情况下交换ij,以便您获得有意义的输出(只需制作确保按照获得的顺序输出ij。)

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

答案 1 :(得分:0)

我认为你不应该在第三个数字和换行符之间留一个空格。

答案 2 :(得分:0)

我注意到的第一个错误接近结束......

printf("%d %d %d \n", vi[i], vj[i], vm[i]);

应该是......

printf("%d %d %d\n", vi[i], vj[i], vm[i]);

我没有看到任何其他错误,但我没有仔细阅读整件事。

另外需要注意的是,他们可能不希望在最后一行的末尾添加换行符号(\ n)。