题目
请利用双重循环编程输出下面的图案:
*
* *
* * *
* * * * *
* * * * * * *
* * * * *
* * *
* *
*
分析
这种编程题一般分为两个部分:计算每行的空格数和星星数。
这里上下对称,所以可以分一半来实现,另一半就直接用就行了。
我们分析上一半:可以看到从第三行开始星星数是奇数的递增(3,5,7,……),空格数是偶数的递减(4,2,0,……),而第二行和第一行的星星数和空格数都比较突兀,星星数分别为(1,2),空格数为(6,5),而且其中的空格数还与最大行号n(就是星星数最多的行,这里的n为5)挂钩。
分析完规律后,由于当n==1和n==2时不适用咱们的规律,所以这里要把行数n==1和n==2这两个情况单独拎出来。
代码
package com.amiao.basicData;
public class PrintStar {
public static void main(String[] args) {
//n == 1 || n == 2单独领出来打印,n >= 3可以开始循环
//rowCount为一半的行数(即为n)
int rowCount = (int) (Math.random() * 10 + 1); //产生1~10的随机数,代表星星最多的行(n)
if (rowCount == 1) { //专门分开n==1和n==2的情况是因为不适用下面的公式
System.out.println("*");
System.out.println("*");
} else if (rowCount == 2) {
System.out.println(" *");
System.out.println("* *");
System.out.println(" *");
} else {
//打印上面一半
for (int i = 1; i <= rowCount; i++) {
printHalf(i, rowCount);
}
//打印下面一半
for(int i = rowCount - 1; i >= 1; i--) {
printHalf(i, rowCount);
}
}
}
//打印n>=3时的星星和空格
private static void printHalf(int i, int rowCount) {
if (i == 1) {
for (int x = 1; x <= (rowCount - 2) * 2; x++) System.out.print(" ");
System.out.println("*");
} else if(i == 2) {
for (int x = 1; x <= (rowCount - 3) * 2 + 1; x++) System.out.print(" ");
System.out.println("* *");
} else {
for (int x = 1; x <= (rowCount - i) * 2; x++) System.out.print(" ");
for (int y = 1; y <= (i * 2) - 3; y++) System.out.print("* ");
System.out.println();
}
}
}
运行结果(可以多运行几遍)
*
* *
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
* *
*