我正试图从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;
}
由于
答案 0 :(得分:3)
在每行末尾输出一个额外的空格。尝试删除此空间,因为自动判断通常会失败。除此之外,你的算法对我来说是正确的。
顺便说一下,没有理由把数字放在向量中 - 你可以在计算时输出每一行的结果。
修改:规范中不清楚i>j
是否可能。在这种情况下,您的代码会输出0
,因此如果删除空格无效,您可以尝试在这种情况下交换i
和j
,以便您获得有意义的输出(只需制作确保按照获得的顺序输出i
和j
。)
编辑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)。