【题目链接】
ybt 1086:角谷猜想
OpenJudge NOI 1.5 21:角谷猜想
【题目考点】
1. while循环
【解题思路】
- 设变量n
- 判断n是否是奇数
- 如果n是奇数,那么将n乘3加1,即
n = n * 3 + 1;
,并输出算式。 - 如果n是偶数,那么将n除以2,即
n /= 2;
,并输出算式。
- 如果n是奇数,那么将n乘3加1,即
- 判断n是否为1,如果是,那么跳出循环。如果不是,继续循环,判断n是否是奇数。
∙ \bullet ∙ 注意:
虽然题目中限定 n <= 2000000,但是n在不断乘3加1的过程中,n的值可能会超出int型可表示的范围,因此本题中变量n必须设为long long类型。
【题解代码】
解法1:使用cout输出算式
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n;//不断乘3+1的过程中,数值会超出int的范围,因而得用long long类型
cin>>n;
while(n != 1)
{
if(n % 2 == 1)//如果n是奇数
{
cout<<n<<"*3+1="<<n * 3 + 1<<endl;
n = n * 3 + 1;
}
else
{
cout<<n<<"/2="<<n / 2<<endl;
n /= 2;
}
}
cout<<"End";
return 0;
}
解法2:使用printf输出算式
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n;//不断乘3+1的过程中,数值会超出int的范围,因而得用long long类型
cin>>n;
while(n != 1)
{
if(n % 2 == 1)
{
printf("%ld*3+1=%ld\n", n, n * 3 + 1);
n = n * 3 + 1;
}
else
{
printf("%ld/2=%ld\n", n, n / 2);
n /= 2;
}
}
cout<<"End";
return 0;
}