PAT-basic-1027 打印沙漏

发布时间 2023-04-12 16:35:10作者: 正明小佐

一、题目


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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *
 

输出样例:

*****
 ***
  *
 ***
*****
2

二、解析


找规律,数学题。先找到轮次i和总字符数n的规律:

i = 1, 2, 3, 4,...
n = 1, 7, 17, 31,...
可以得到i和n的公式, n = 2i^2-1

然后打印下三角,先打印空格,再打印字符,其实还是找规律

最后打印上三角,先打印空格,再打印字符

三、代码


javaAC版:

import java.util.Scanner;

public class Main {
    private static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        int n = input.nextInt();    // n是总共的符号个数
        String c = input.next();
        /**
         * 找一找这一题的规律
         *         i = 1, 2, 3, 4,...
         *         n = 1, 7, 17, 31,...
         * 可以得到i和n的公式, n = 2i^2-1
         */
        int index = (int)Math.sqrt((n+1)/2);
//        System.out.println("index: " + index);
        int remainCharactor = n-(2*index*index - 1);
//        System.out.println(remainCharactor);
        // 先打印下三角
        // 先空行, 其规律是0, 1, 2, ..., i-1
        // 再字符,其规律是2i-1, 2i-3, ..., 1
        for(int i=index; i>0; i--){
            for(int j=index-i; j>0; j--)
                System.out.print(" ");
            for(int k=(2*i-1); k>=1; k--)
                System.out.print(c);
            System.out.println();
        }

        /**
         * 再打印下三角
         * 先空行,其规律是 i-2, i-3, ..., 0
         * 再字符,其规律是 3, 5, 2i-1
         */
        for(int i=1; i<index; i++){
            for(int j=index-i-1; j>0; j--)
                System.out.print(" ");
            for(int k=0; k<(2*i+1); k++)
                System.out.print(c);
            System.out.println();
        }
        System.out.println(remainCharactor);
    }
}

c++:

//
// Created by dongdong on 2023/4/10.
//
#include "iostream"
#include "math.h"
int main(){
    int n;
    char c;
//    19 std::cin>>n>>c;
    scanf("%d %c", &n, &c);
    int index = (int)(sqrt((n+1)/2));
    int remainCharactor = n-(2*index*index - 1);
    for(int i=index; i>0; i--){
        for(int j=index-i; j>0; j--)
            printf(" ");
        for(int k=(2*i-1); k>=1; k--)
            printf("%c", c);
        printf("\n");
    }
    for(int i=1; i<index; i++){
        for(int j=index-i-1; j>0; j--)
            printf(" ");
        for(int k=0; k<(2*i+1); k++)
            printf("%c", c);
        printf("\n");
    }
    printf("%d", remainCharactor);
    return 0;
}