思路
- 计算我们能打印出的最大沙漏所用的符号个数(以下称为 “有效符号数”)
- 根据上一步得到的 有效符号数 ,打印图案
难点
1. 如何计算 有效符号数?
模拟人工计算过程
- 判断题目给出的符号数是否大于 1 ?是否大于 7 ?是否大于 17 ?…以此类推,直到我们发现给出的符号数小于某个值,这时就可以得到 有效符号数了
2. 如何打印图案?
仔细观察不难发现,其实每行图案都是由一定的空格 + 题目给定的特殊符号构成的;
想要正确打印图案,就需要确定每行空格数 、特殊符号数
- 确定每行空格数:相邻两行相差2个符号,每相差一个符号,开头就需要多加一个空格;因此,“(最后一行符号数 - 当前行符号数) / 2” 就可得到当前行开头空格数
- 确定每行特殊符号数:只要确定了最长那一行符号数,每一行符号数就都确定了。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String symbol = sc.next();
if (n == 0) {
System.out.println(0);
return;
}
int numOfSymb = 1;
int augment = 6;
while (n >= numOfSymb) {
numOfSymb += augment;
augment += 4;
}
numOfSymb -= (augment - 4);
int remain = n - numOfSymb;
int lastNum = (augment - 4) / 2 - 2;
int curNum= lastNum;
boolean flag = false;
while(numOfSymb > 0){
if(curNum == 1)flag = !flag;
for (int i = 0; i < (lastNum - curNum) / 2; i++) {
System.out.print(" ");
}
for (int i = 0; i < curNum; i++) {
System.out.print(symbol);
}
numOfSymb -= curNum;
System.out.println();
if(flag) curNum += 2;
else curNum -= 2;
}
System.out.println(remain);
}
}