【发布时间】:2018-04-25 17:23:26
【问题描述】:
所以,我很无聊,决定做一些完全随机的事情,然后我遇到了 collatz 猜想:从任何正数开始,如果是偶数,则除以 2。如果是奇数,则乘以三并加一。重复此操作时,您将以第一名结束。所以我做了这个代码:
//卢卡斯·诺克的科拉茨猜想
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
long long n;
cin >> n;
cout << setw(5) << n;
while(true){
if(n % 2 == 0 && n != 1){
//is even
cout << " E" << endl;
n /=2;
cout << setw(5) << n;
}
else if(n != 1){
//is odd
cout << " O" << endl;
n = n * 3 + 1;
cout << setw(5) << n;
}
else break;
}
cout << " O" << endl << endl << "end loop";
return 0;
}
我还在学习 c++(我刚刚完成了 sololearn 课程,我即将获得“C++ for dummies all-in-one”一书),但我认为这对我来说是一个好的开始,而且它很有效.
只有一个小问题:如果我使用大数字,它确实会停在 1 处,并得到奇数和偶数,但是......
输入时查看输出的第一部分
“1000000000000000000000000”:
9223372036854775807 O
9223372036854775806 E
4611686018427387903 O
-4611686018427387906 E
-2305843009213693953 O
-6917529027641081858 E
-3458764513820540929 O
8070450532247928830 E
4035225266123964415 O
-6341068275337658370 E
-3170534137668829185 O
8935141660703064062 E
4467570830351532031 O
-5044031582654955522 E
-2522015791327477761 O
-7566047373982433282 E
-3783023686991216641 O
7097673012735901694 E
3548836506367950847 O
-7800234554605699074 E
嗯,这有点奇怪,不是吗? (别看换行符,叠得很完美,只是这里没有显示,因为我复制了输出)
谁能解释一下为什么会发生这种情况以及如何解决它?
【问题讨论】:
-
我认为你已经超过了 64 位整数的最大值。
-
是的,我也是这么想的,有什么办法让它变大吗? xD
-
你需要一个大的 int 库。
-
或者如果你坐下来很无聊,写你自己的大 int 函数作为练习?如果你使用基本的 32 位和 64 位操作,这很容易做到,但如果使用基本的 8 位和 16 位操作,则更容易理解和调试
标签: c++ output long-integer collatz