Итак, мне было скучно, и я решил сделать что-то совершенно рандомное, тут я наткнулся на гипотезу Коллатца: начать с любого положительного числа, а если оно четное, то разделить на два. Если нечетное, умножьте на три и прибавьте единицу. Повторяя это, вы закончите под номером один. Поэтому я сделал этот код:
// Гипотеза Коллатца Лукаса Кнука
#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++ для чайников, все в одном"), но я думаю, что это хорошее начало для меня, и оно работает.
Есть только одна маленькая проблема: если я использую большие числа, они останавливаются на единице и правильно определяют нечетные и четные числа, но...
Посмотрите на эту первую часть вывода при вводе «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
Эм, это немного странно, не так ли? (не смотрите на разрывы строк, они идеально сложены, просто не отображаются здесь, потому что я скопировал вывод)
Может кто-нибудь объяснить мне, почему это происходит и как это исправить?