我在stackoverflow等上看到了一些关于3n+1 problem的问题,并尝试修复上述提示以使代码正确。例如,我现在检查是否a > b
。或者我使用long long
代替简单int
。但仍然得到错误的答案。我的回答有什么问题?
我的代码:
#include <iostream>
using namespace std;
int count_steps(long long int num)
{
int counter = 1;
while(num != 1)
{
if (num % 2 == 1)
num = 3*num + 1;
else
num /= 2;
counter++;
}
return counter;
}
int max_between(long long int a , long long int b)
{
int max=0,step;
for(long long int i = a; i <= b; i++)
{
if ((step = count_steps(i)) > max)
max = step;
}
return max;
}
int main()
{
int max=0,a,b,step;
cin >> a;
cin >> b;
if (a >= b)
cout << a << ' ' << b << ' ' << max_between(b,a) << endl;
else
cout << a << ' ' << b << ' ' << max_between(a,b) << endl;
return 0;
}
测试用例:
1 10 (input)
1 10 20 (output)
900 1000 (input)
900 1000 174 (output)
1 1000000 (input)
1 1000000 525 (output)
1000000 1 (input)
1000000 1 525 (output)
答案 0 :(得分:3)
对您的代码的一些评论:
您正在阅读a
和b
作为int
,但在方法中将它们用作long long int
。这是无稽之谈,将它们视为将要使用的类型。
虽然不太可能,但您可能会遇到溢出问题。为避免这种情况,您可以使用unsigned long long
将整数范围加倍。
从数学角度讲,你做得太多了。
对于奇数整数n = 2 k + 1
,结果3 n + 1
将始终为偶数:3 n + 1 = 3(2 k + 1) + 1 = 6k + 4
。因此,您可以将奇数n
的大小写与以下除以2的大小写合并。结果是3 k + 2
,k + 1
大于n
。在C ++中使用整数运算,可以使用n += (n / 2) + 1
计算,n / 2
将计算为k
。
输入/输出代码未被接受的另一种可能性。您必须遵循平台的确切要求。
您的代码忽略了以下问题描述:
输入将由一系列整数组成
这很容易修复
int main()
{
int max=0,a,b,step;
while ( cin >> a >> b )
{
std::cout << a << ' ' << b << ' ';
if (a >= b)
{
std::cout << max_between(b,a);
}
else
{
std::cout << max_between(a,b);
}
std::cout << std::endl;
}
return 0;
}