一、题目链接
http://noi.openjudge.cn/ch0105/21/
二、解题思路
◎ 计算过程可能会超出int类型的范围,因此需要将int类型的整数N转存为long类型(C++程序为long long类型)的整数n;
◎ 容易看出,循环内容可以分为偶数和奇数两种流程:
→ 如果当前整数是偶数,则先将当前整数缩小一半,然后输出字符串"/2="和当前整数;
否则,当前整数是奇数,则先将当前整数乘3再加1,然后输出字符串"*3+1="和当前整数;
◎ 在当前整数尚未变为1时,循环处理如下;
→ 输出当前整数;
→ 如果当前整数是偶数,则执行偶数流程;
否则,当前整数是奇数,则执行奇数流程。
三、实施步骤
◎ 首先,定义并输入int类型的整数N,代表任意的正整数;
◎ 其次,定义long类型(C++程序为long long类型)的整数n,令n = N;
◎ 然后,在n不为1时,循环处理如下:
→ 输出n;
→ 如果n%2==0:
*** 令n=n/2,输出"/2="和n;
否则:
*** 令n=n*3+1,输出"*3+1="和n;
上述循环结束后,角谷猜想的主体部分输出完毕;
◎ 输出End。
四、Java程序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
long n = N;
while (n != 1) {
System.out.print(n);
if (n % 2 == 0) {
n = n / 2;
System.out.println("/2=" + n);
}
else {
n = n * 3 + 1;
System.out.println("*3+1=" + n);
}
}
System.out.print("End");
}
}
五、C++程序
#include <iostream>
using namespace std;
int main()
{
int N;
cin >> N;
long long n = N;
while (n != 1)
{
cout << n;
if (n % 2 == 0)
{
n = n / 2;
cout << "/2=" << n << endl;
}
else
{
n = n * 3 + 1;
cout << "*3+1=" << n << endl;
}
}
cout << "End";
return 0;
}