我正在解决Weird Algorithm问题:
考虑一个以正整数n作为输入的算法。如果n是偶数,算法将其除以2,如果n是奇数,算法将其乘以3并加1。算法重复这个过程,直到n为1。例如,n=3的序列如下:3→10→5→16→8→4→2→1
你的任务是模拟给定n值的算法的执行。
输入
唯一的输入行包含整数n。
输出
打印一行,其中包含算法中所有的n值。
约束
1≤n≤10^6
问题已解决,但面临OUTPUT LIMIT EXCEED
问题。找了很多,但找不到任何方法来解决这个问题。它工作正常,直到我输入= 270271
,它给出了意外的输出,包括负值。
#include <iostream>
using namespace std;
void fun(int n) {
if (n != 1) {
if (n % 2 == 0) {
n = n / 2;
} else {
n *= 3;
n++;
}
cout << " " << n;
fun(n);
}
}
int main() {
int n;
cin >> n;
cout << " " << n;
fun(n);
return 0;
}
2条答案
按热度按时间jmp7cifd1#
尽量不要在这里使用递归,如果递归深度太大,它可能会使二进制文件崩溃,Collatz序列有时可能会很长,请尝试使用while循环。溢出堆栈可能会产生这种超额输出。
此外,在某些输入上,您可能会出现
int
溢出。使用uint64_t
代替。就像下面的代码一样。完整更正程序:
在线试用!
输入:
输出量:
如果你的序列中有比uint64_t更大的数字,那么你可以使用
unsigned __int128
,它在CLang/GCC编译器中可用(但在MSVC中不可用)。然后你会得到下面的代码。您可能注意到我对cout使用了128位输出的特殊处理,因为__int128没有内置的cout。我还使用了已知最长的60位起始序列(从这里开始),从60位数字开始,它是
2283
步,有128位中间值,我用它来展示128位计算和输出。在线试用!
输出(部分,由于StackOverflow限制):
128-上面的位代码甚至可以处理已知的最长序列(参见here),具有2968步。但是起始值不能通过std::cin输入,一种方法是将其作为一个常量,就像下面修改的代码一样,这会导致Output(partial):
yhxst69z2#
不用递归就解决了这个问题