PTA团体程序设计天梯赛练习集-L1-002-打印沙漏 (Java)

tech2022-08-04  95

题目

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

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

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

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

思路

先求出星号的最大数,在使用2个2层循环分别输出图案的上下两部分。

代码

import java.util.*; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner sc=new Scanner(System.in); int n=sc.nextInt(); String str=sc.next(); int i,sum=-1; //i为最长的一行的*数量,sum为使用的*总数。 //由于最中间只有一行是有一个*的,所以sum设为-1,方便下列循环 for(i=1;sum<=n;i=i+2)//循环计算使用的*数量, { sum+=2*i;//图案上下对称,行差为2,每次加两行 } sum=0; i=i-4;//循环结束时,i多加了两次2,自减4之后才是正确的最大数 for(int j=i;j>0;j=j-2) {//j为每一行的*数量,每次减2 for(int k=(i-j)/2;k>0;k--)//每行输出(i-j)/2个空格 System.out.print(" "); for(int l=j;l>0;l--)//每行输出j个星号 { System.out.print(str); sum++; } System.out.println(); } for(int j=3;j<=i;j=j+2) {//与上一个循环同理 for(int k=(i-j)/2;k>0;k--) System.out.print(" "); for(int l=j;l>0;l--) { System.out.print(str); sum++; } System.out.println(); } System.out.print(n-sum); } }

注:非最优解。注解已补,欢迎参考讨论提问=。=

最新回复(0)