观察题目样例
*****
***
*
***
*****
可以发现,上半部分是一个倒三角形,下半部分是一个正三角形,两个三角形共用一个定点。
假设此样例中一共有
3
3
3 行
∗
*
∗,倒三角部分的
∗
*
∗ 数量是一个等差数列,个数位:
5
+
3
+
1
5+3+1
5+3+1,正三角形部分的
∗
*
∗ 数量也是一个等差数列,
1
+
3
+
5
1+3+5
1+3+5,公差为
2
2
2。
那么假设一共有
n
n
n 行(这个
n
n
n 表示的不是总行数,而是一个三角形的行数),那么每一个三角形部分有
(
1
+
(
1
+
(
n
−
1
)
×
2
)
)
×
n
÷
2
(1+(1+(n-1) \times 2)) \times n \div 2
(1+(1+(n−1)×2))×n÷2
(首项
+
+
+ 末项)
×
\times
× 项数
÷
\div
÷ 2 个
∗
*
∗ ,那么整个
n
n
n 行沙漏,一共有
2
×
n
×
n
−
1
2 \times n \times n - 1
2×n×n−1 个
∗
*
∗,那么便可以根据此公式去计算最多可以打印多少行
∗
*
∗,以及最终会剩余多少个
∗
*
∗。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
char ch = s.charAt(0);
/**
* 1 3 5
* 2 6 10
* 首项为2,公差为4的等差数列前n项和:
* (2+(2 + (n-1)*4)) * n / 2
* 2*n*n-1
* */
int m = 0;
while(2*m*m-1<=n) {
m++;
}
m--;
for(int i=1;i<=m;i++) {//倒三角
for(int j=1;j<=i-1;j++) {
System.out.print(" ");
}
for(int j=1;j<=2*(m-(i-1))-1;j++) {
System.out.print(ch);
}
System.out.println();
}
for(int i=2;i<=m;i++) {//正三角
for(int j=1;j<=m-i;j++) {
System.out.print(" ");
}
for(int j=1;j<=2*i-1;j++) {
System.out.print(ch);
}
System.out.println();
}
System.out.println(n-(2*m*m-1));//剩余数量
}
}