PAT乙级1027 打印沙漏 java实现

思君在远方,钟鼓漏声长。——题记

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

*****

 ***

   *

 ***

*****

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

*****

 ***

  *

 ***

*****

2

基本思路:

(1)计算这道题,首先要根据输入的数字n 求得最大可输出的“沙漏”需要字符个数。有因为这个沙漏是由两个对称三角组成,且三角形的底边字符数为奇数个。我们不妨设底边为x,则一个三角所用字符为1+3+5+....+x=((1+x)*(1+x)/2)/2 个。则沙漏所需字符个数为(1+x)*(1+x)/2-1。因为(1+x)*(1+x)/2-1<n,则x<=(2*(1+x))^(1/2)-1。若为偶数,则要再减1。

(2)计算各行打出的空格数。设某行有i 个飞空字符串,则空格有(x-i)/2 个。

(3)剩余的飞空字符串个数为 n-((1+x)*(1+x)/2-1) 个。

代码奉上:

package pat;

import java.util.Scanner;

//打印沙漏
public class B027 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int k=sc.nextInt();String s=sc.next();

//得到三角形底边的个数
int bt=(int)Math.sqrt(2.0*(k+1))-1;
//因为底边个数为奇数,所以判斷若为偶数时,减一
if(bt%2==0) {
	bt=bt-1;
}
//输出的非空格的字符总数
int count=k-((1+bt)*(1+bt)/2-1);
//打印上三角
for(int i=bt;i>=1;i-=2) {
	//先打印空格
	for(int j=0;j<(bt-i)/2;j++) {
		System.out.print(" ");
	}
	//打印字符
	for(int i1=0;i1<i;i1++) {
		if(i1!=i-1) {
		System.out.print(s);}
		if(i1==i-1) {
			System.out.println(s);
		}
		
	}
}
//打印下三角
for(int i=3;i<=bt;i+=2) {
	//先打空格
	for(int j=0;j<(bt-i)/2;j++) {
		System.out.print(" ");
	}
	//打印字符
	for(int m=0;m<i;m++) {
		if(m!=i-1) {
		System.out.print(s);
		}
		if(m==i-1) {
			System.out.println(s);
		}
	}
}

//打印剩余字符的个数
System.out.print(count);
	}

}
发布了13 篇原创文章 · 获赞 11 · 访问量 873

猜你喜欢

转载自blog.csdn.net/weixin_43156201/article/details/104098624