题目:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String s1 []= s.split(" ");
int a[]=new int[1];
//存储整数
a[0]=Integer.parseInt(s1[0]);
//String b[]= new String[]{s1[1]};//存储字符
int t = hang(a[0]);//记录上半行数
int t2=t;
int t1=t+1;//记录下部分加中间的单个字符
int sum= 0;
//计算最接近的sum值
for(int i = 1;i<=t1;i++){
if(i==1){
sum+=2*i-1;
}else{
sum+=(2*i-1)*2;
}
}
// 打印上半部分的图案(递减的星号数量)
for (int i = 0; i <t; i++) {
// 打印每行前面的空格
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
// 打印每行的星号
for (int k = 0; k <((t2+1)*2-1); k++) {
System.out.print("*");
}
// 每行打印完毕后换行
System.out.println();
t2--;
}
//打印下半部分
for (int i = 1; i <=t1 ; i++) {
for (int j = 1; j <=t1-i ; j++) {
System.out.print(" ");
}
for (int j = 1; j <=2*i-1 ; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println(a[0]-sum);
}
//计算行数
public static int hang(int a){
int sum = 1;//第一行
for(int i = 2;;i++){
sum=sum+2*(2*i-1);
if(sum>a){
return i-2;//除掉中间的单个字符的行数
}else if(sum==a){
return i-1;//除掉中间的单个字符的行数
}
}
}
}
运行结果:
30 *
*****
***
*
***
*****
13
19 *
*****
***
*
***
*****
2