我正在努力解决数学问题。我声明一个“数字”,如果它是偶数,它被分成2,如果它是奇数,它乘以3和+1。但是,我想使用迭代,但由于某种原因,我的程序无法使用它。这是两个代码,一个是通过声明数字为13,另一个是使用迭代语句。
#include <iostream>
using namespace std;
int main(){
int sum = 0;
int number = 13;
cout << "\nFOR THIS NUMBER : " << number;
while (number > 1){
if (number % 2 != 0){
number = 3 * number + 1;
cout << "\n" << number;
sum = sum + 1;
}
if (number % 2 == 0){
number = number / 2;
cout << "\n" << number;
sum = sum + 1;
}
}
cout << "\n\nThe sum is : " << sum << "\n";
return 0;
}
按预期输出40,20,10,5,16,8,4,2,1。
以下是其他代码:
#include <iostream>
using namespace std;
int main(){
int sum = 0;
for (int number = 13; number < 14; number = number + 1){
cout << "\nFOR THIS NUMBER : " << number;
while (number > 1){
if (number % 2 != 0){
number = 3 * number + 1;
cout << "\n" << number;
sum = sum + 1;
}
if (number % 2 == 0){
number = number / 2;
cout << "\n" << number;
sum = sum + 1;
}
}
cout << "\n\nThe sum is : " << sum << "\n";
}
return 0;
}
这应该输出完全相同的答案,但是当我运行它时,它会变成无限循环。有人可以帮忙吗?
答案 0 :(得分:1)
我认为核心问题是你使用number
作为循环控制变量,但你也在修改循环内部number
的方式与控制外部没有任何关系环。这显然是一种容易出错的做法。
我建议你将循环控制与hailstone sequence计算分开。例如:
#include <iostream>
using namespace std;
int main(){
int sum = 0;
for (int loop = 13; loop < 14; ++loop){
int number = loop;
cout << "\nFOR THIS NUMBER : " << number;
while (number > 1){
if (number % 2 != 0){
number = 3 * number + 1;
} else {
number /= 2;
}
cout << "\n" << number;
++sum;
}
cout << "\n\nThe sum is : " << sum << "\n";
}
return 0;
}
现在for
循环很容易推理,因为loop
未在多个位置修改过。
答案 1 :(得分:0)
当你的号码变为2时,它会进入无限循环。如果阻止,则数字2在第2个中变为1。然后它再次由“number = number + 1”变为2。然后在第二个if块中以“number = number / 2”再次变为1
所以,你需要打破...当数字为2时
答案 2 :(得分:0)
根据您的第一个代码,number
是&#34; 1&#34;当它从循环中退出时。
所以&#34;对于&#34;我们有number
等于&#34; 1&#34;它不小于&#34; 14&#34;并且编译器不会在任何时候退出for循环。
我认为此代码可以正常运行:
for (int number = 13; number != 2; number = number + 1){
cout << "\nFOR THIS NUMBER : " << number;
while (number > 1){
if (number % 2 != 0){
number = 3 * number + 1;
cout << "\n" << number;
sum = sum + 1;
}
if (number % 2 == 0){
number = number / 2;
cout << "\n" << number;
sum = sum + 1;
}
}
答案 3 :(得分:0)
当数字小于1时,你离开内部while循环。然后在显示后你应该休息一下以离开for循环。除非你将infinly循环,因为数字将少于14。
答案 4 :(得分:0)
你需要两个“数字”:一个在for循环控制中,它是当前“数字”,用于启动一个向上/向下的值序列,另一个是当前的“数字”,用于其中一个的向上/向下序列开始“数字”。
当你的for循环返回到顶部时number
已用于保存上/下序列中的每个值,但for循环逻辑期望它保持不变。
制作两个变量。
for (int start = 13; start < 14; start = start + 1){
cout << "\nFOR THIS NUMBER : " << start;
number = start;
...
}
这给出了:
#include <iostream>
using namespace std;
int main(){
int sum = 0;
for (int start = 13; start < 14; start = start + 1){
cout << "\nFOR THIS NUMBER : " << start;
number = start;
while (number > 1){
if (number % 2 != 0){
number = 3 * number + 1;
cout << "\n" << number;
sum = sum + 1;
}
if (number % 2 == 0){
number = number / 2;
cout << "\n" << number;
sum = sum + 1;
}
}
cout << "\n\nThe sum is : " << sum << "\n";
}
return 0;
}