【Java】P5727 冰雹猜想—简化版打表—(OJ:洛谷)
题目
题目来源:洛谷OJ
题目链接:
题目描述
给出一个正整数 n(n\le 100)n(n≤100),然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以 2。经过若干次循环后,最终都会回到 1。经过验证很大的数字(7\times10^{11}7×1011)都可以按照这样的方式比变成 1,所以被称为“冰雹猜想”。例如当 nn 是 20,变化的过程是 [20, 10, 5, 16, 8, 4, 2, 1]。
根据给定的数字,验证这个猜想,并从最后的 1 开始,倒序输出整个变化序列。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
20
输出 #1复制
1 2 4 8 16 5 10 20
思路
-
首先先算出1~100中,冰雹猜想的最大数组长度是多少
这里我写了一个方法
arraysMax()
/*
* 雹猜想的每个数数组的最大长度
*/
private static void arraysMax() {
int a [] = new int [101]; // 存储每个数数组的最长长度
for(int i=1; i<101; i++) { // 1 ~ 100 循环
int count = 0; // 计数器
int n = i; // n 为具体运算的变量
while(n!=1) { // 当n不等于1的时候循环,否则跳出循环
if(n%2!=0) { // 奇数运算
n = n * 3 + 1;
}
else { // 偶数运算
n = n / 2;
}
count++;
}
a[i] = count; // 数据存入
}
Arrays.sort(a); // 排序
System.out.println(a[99]); // 输出最大值
}
- 再定义存储数组,将冰雹猜想的结果存入数组中,最后反向输出即可
Java源代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
public class P5727冰雹猜想 {
public static void main(String[] args) throws IOException{
//冰雹猜想的每个数数组的最大长度
//此方法单独使用,只为求出最大长度,提交时要注释掉
// arraysMax(); // == 115
//快读读写模板
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer st = new StreamTokenizer(br);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
st.nextToken();
int n = (int) st.nval;
int a [] = new int [115]; // 115即使arraysMax()方法求出的最大数组长度
int ii = 0; // 记录实际数组长度
for(int i=0; i<115; i++) {
a[i] = n;
if(n==1) { // 跳出循环
ii = i;
break;
}
if(n%2!=0) {
n = n * 3 + 1;
}
else {
n = n / 2;
}
}
for(int i=ii; i>=0; i--) {
pw.print(a[i]+" "); // 输出
}
pw.flush();
}
/*
* 雹猜想的每个数数组的最大长度
*/
private static void arraysMax() {
int a [] = new int [101]; // 存储每个数数组的最长长度
for(int i=1; i<101; i++) { // 1 ~ 100 循环
int count = 0; // 计数器
int n = i; // n 为具体运算的变量
while(n!=1) { // 当n不等于1的时候循环,否则跳出循环
if(n%2!=0) { // 奇数运算
n = n * 3 + 1;
}
else { // 偶数运算
n = n / 2;
}
count++;
}
a[i] = count; // 数据存入
}
Arrays.sort(a); // 排序
System.out.println(a[99]); // 输出最大值
}
}