PAT-basic-1027 打印沙漏
一、题目
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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;
}