我有这段代码,它应该找到给定范围内所有整数的Collatz序列,由用户输入定义。问题是在for
循环中,current_number
永远不会增加,或者在内部while
循环中,current_number != 1
永远不会失败。我错过了什么?
while (lower != 0 && upper != 0) {
cout << "Lower bound (integer): ";
cin >> lower;
cout << "Upper bound (integer): ";
cin >> upper;
if (lower == 0 || upper == 0)
return 0;
for (current_number = lower; current_number <= upper;
++current_number) {
//cout << current_number << endl;
counter = 0;
sequence = sequence + to_string(current_number) + ", ";
while (current_number != 1) {
if (current_number % 2 == 0) {
current_number = current_number / 2;
sequence = sequence + to_string(current_number) + ", ";
}
else {
current_number = current_number * 3 + 1;
sequence = sequence + to_string(current_number) + ", ";
}
cout << current_number << endl;
++counter;
}
//if (counter > longest) {
// longest = counter;
// the_longest_seed = current_number;
//}
}
cout << sequence << endl;
}
答案 0 :(得分:7)
current_number % 2 == 0
适用于所有current_number = 0, 2, 4, 6, ...
。
如果发生这种情况,请将current_number
设置为current_number / 2
..因此当current_number
为2时,您将其设置为1,然后将其递增({{1} }),然后又是2(++current_number
),所以你将进入!= 1
循环,然后因为while
你将它再次设置为1 ..依此类推...... :_(
生活提示:调试您的代码,它将节省时间,精力,有时甚至是金钱。
答案 1 :(得分:0)
关于永不失败的循环。如果current_number!= 1并且它不是2(如果是,那么另一个人已经回答),它进入while循环并且永远不会结束,因为......
让我们说它是3:
3%2!= 0,因此它变为10,
10%2 == 0,因此它变为5,
5%2!= 0,因此它变为16
...
永远不会失败。
答案 2 :(得分:0)
在另一个错误旁边,您还使用current_number
迭代输入范围,然后更改它以输出Collatz序列。您应该更改current_number
。