我正在尝试从史蒂文·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
,因此,如果删除空格没有帮助,您可以尝试在这种情况下交换i
和j
,以便获得有意义的输出(只需确保以与您相同的顺序输出i
和j
抓到他们了)。
编辑2 :这很可能是问题所在:您在计算中使用了int
,在大多数平台上,它最多可以存储2147483647的值。但是,计算循环长度将需要大于该数字的数字(例如,对于初始值113383)。如果使用long long
(假设支持),则应该可以。
关于c++ - 帮助编程挑战,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6629802/