[Java基础] 输出回形数
输出回形数, 根据两种算法画图如下:
第一种算法: 分析行特征,按行输出
import java.util.Scanner;
public class CircleFormNumber {
public static void main(String[] args) {
System.out.println("请输入一个数,按回车结束:");
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int parallelNum = 0;// parallelNum:一行输出中,中间重复数字的个数
Long beginMillis = System.currentTimeMillis();
// 算法开始执行的时间
int totalLines = 2 * n - 1;// 计算输出的总行数
// --算法部分--
for (int i = 0; i < totalLines; i++) {
if (i < n) {
parallelNum = totalLines - 2 * i;
// 当行数小于初始数时,totalLines-2*i是正值
for (int j = 0; j < totalLines; j++) {
// 一行一行地输出,j表示第j个位置上的数
// 当j<i的时候,输出递减一的数值
if (j < i) {
System.out.print(n - j + " ");
}
// 当j>=i && j<i+parallelNum的时候,重复输出该行最小
else if (j >= i && j < i + parallelNum) {
System.out.print(n - i + " ");
}
// 当j>i+parallelNum-1 && j<totalLines的时候,输出递增1的数值
else if (j > i + parallelNum - 1 && j < totalLines) {
System.out.print(j - n + 2 + " ");
}
}
} else {
// 当行数大于初始数时,将该行转换为上面对应输出相同的行,第i行的对应行数k
int k = 2 * n - 2 - i;// k+i=2n-2
parallelNum = totalLines - 2 * k;
// 重新计算一行输出中,中间重复数字的个数
for (int j = 0; j < totalLines; j++) {
if (j < k) {
System.out.print(n - j + " ");
} else if (j >= k && j < k + parallelNum) {
System.out.print(n - k + " ");
} else if (j > k + parallelNum - 1 && j < totalLines) {
System.out.print(j - n + 2 + " ");
}
}
}
System.out.println();
}
Long endMillis = System.currentTimeMillis();// 算法结束执行时间
long executeTime = endMillis - beginMillis;// 算法消耗时间
System.out.println("算法从开始执行到结束共用了 " + executeTime + "毫秒");// 打印算法消耗时间
}
}
第二种算法: 一圈一圈地生成, 而不是一行一行的生成, 将生成的值付给二维数组
思路清晰,但效率不是很高
import java.util.Scanner;
public class CircleFormNumber {
// num代表一共几圈,n代表当前第几圈
void f(int num, int n, int[][] array, int length) {
for (int i = n; i < length; i++) {
array[n][i] = num;
array[i][n] = num;
array[length - 1][i] = num;
array[i][length - 1] = num;
}
if (num > 0) {
f(num - 1, n + 1, array, length - 1);
} else {
printArr(array);
}
}
void printArr(int[][] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
CircleFormNumber t = new CircleFormNumber();
System.out.print("请输入一个数,按回车结束:");
Scanner reader = new Scanner(System.in);
int num = reader.nextInt();
int[][] array = new int[2 * num - 1][2 * num - 1];
int length = array.length;
Long beginMillis = System.currentTimeMillis();
// 算法开始执行的时间
t.f(num, 0, array, length);
Long endMillis = System.currentTimeMillis();
// 算法结束执行时间
long executeTime = endMillis - beginMillis;
// 算法消耗时间
System.out.println("算法从开始执行到结束共用了 " + executeTime + "毫秒");// 打印算法消耗时间
}
}