打印沙漏-给出1个正整数N(≤1000)和一个符号,中间以空格分隔
```csharp
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入要N以及符号
Scanner scan = new Scanner(System.in);
String[] scanArr = scan.nextLine().split(" ");
int total = Integer.valueOf(scanArr[0]);
String mark = scanArr[1];
scan.close();
//获取单边打印的行数-例如沙漏的上部是从1,3,5,7...那么第一行是1,从第二行开始每行的个数是 2*row+1,因为
//要沙漏两边除了第一行,剩余都是堆成的,所以需要乘以2
int sum = 1;
int row=1;
while (sum<total){
sum += 2*(2*row+1);
if(sum<=total) row++;
}
//开始打印-这里的难点是要打印空格和符号,空格字符串我们用spacePrintStrSb来表示,符号用markPrintStrSb来表示
//那么我们只需要知道最大行打印的个数是 2*row+1 ,而每行的符号是x ,然后空格就是 (2*row+1-x)/2 这么多个了
//下面的计算中 row-a 以及第二个for循环中的 row-b-1 都是计算过的
int markPrintNum;
StringBuilder spacePrintStrSb = new StringBuilder();
StringBuilder markPrintStrSb = new StringBuilder();
for(int a=row;a>0;a--){
spacePrintStrSb.setLength(0);
markPrintStrSb.setLength(0);
markPrintNum = 2*a-1;
for(int c=0;c<(row-a);c++){
spacePrintStrSb .append(" ");
}
for(int d=0;d<markPrintNum;d++){
markPrintStrSb.append(mark);
}
System.out.println(spacePrintStrSb.append(markPrintStrSb).toString());
}
for(int b=1;b<row;b++){
spacePrintStrSb.setLength(0);
markPrintStrSb.setLength(0);
markPrintNum = 2*b+1;
for(int c=0;c<(row-b-1);c++){
spacePrintStrSb .append(" ");
}
for(int d=0;d<markPrintNum;d++){
markPrintStrSb.append(mark);
}
System.out.println(spacePrintStrSb.append(markPrintStrSb).toString());
}
//最后打印的是剩下的符号数,这里不在赘述
System.out.println(total-sum>=0? (total-sum) : total-(sum - 2*(2*row+1)) );
}
}