Skip to content

1027 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定 17 个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****
*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差 2;符号数先从大到小顺序递减到 1,再从小到大顺序递增;首尾符号数相等。

给定任意 N 个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出 1 个正整数 N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

tex
19 *
19 *

输出样例:

tex
*****
 ***
  *
 ***
*****
2
*****
 ***
  *
 ***
*****
2

Solution:

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String[] input = in.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        String shape = input[1];
        int row = 1, need = 1, i;
        for (i = 3; 2 * i + need <= n; i += 2) {
            need += 2 * i;
            row++;
        }
        i -= 2;
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < row; j++) {
            for (int k = 0; k < j; k++) {
                sb.append(" ");
            }
            for (int k = 0; k < i; k++) {
                sb.append(shape);
            }
            sb.append("\n");
            i -= 2;
        }
        i += 4;
        for (int j = row - 2; j >= 0; j--) {
            for (int k = 0; k < j; k++) {
                sb.append(" ");
            }
            for (int k = 0; k < i; k++) {
                sb.append(shape);
            }
            sb.append("\n");
            i += 2;
        }
        System.out.printf("%s%d", sb, n - need);
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String[] input = in.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        String shape = input[1];
        int row = 1, need = 1, i;
        for (i = 3; 2 * i + need <= n; i += 2) {
            need += 2 * i;
            row++;
        }
        i -= 2;
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < row; j++) {
            for (int k = 0; k < j; k++) {
                sb.append(" ");
            }
            for (int k = 0; k < i; k++) {
                sb.append(shape);
            }
            sb.append("\n");
            i -= 2;
        }
        i += 4;
        for (int j = row - 2; j >= 0; j--) {
            for (int k = 0; k < j; k++) {
                sb.append(" ");
            }
            for (int k = 0; k < i; k++) {
                sb.append(shape);
            }
            sb.append("\n");
            i += 2;
        }
        System.out.printf("%s%d", sb, n - need);
    }
}

Released under the MIT License.