打印沙漏-给出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)) );
    }
}

Tags: