1027 打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
思路
首先要知道沙漏一共有几行,然后直到每行输出的符号个数
while (temp <n)
{
i+=2;
flag++;
temp = i*2+temp;
// System.out.println(temp);
}`
判断一共有多少行
flag
用来标记一半沙漏的行数
然后存放每行字符个数
> for (int j = 1; j < flag; j++) {
num1[j]=num1[j-1]+2;
res = num1[j]+res;
// System.out.println(num1[j]);
}
最后输出沙漏字符
private static void shalou(String str, int[] num1, int l) {
for (int m = 0; m < num1[l]; m++) {
if (m==0)
{
for (int j = 0; j < (num1[num1.length-1]-num1[l])/2 ; j++) {
System.out.print(" ");
}
}
System.out.print(str);
}
System.out.println();
}
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class code1027 {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
String []num = buf.readLine().split(" ");
int n = Integer.parseInt(num[0]);
String str = num[1];
int res =0;
int temp = 0;
int flag = 0;
int i = 1;
while (temp <n)
{
i+=2;
flag++;
temp = i*2+temp;
// System.out.println(temp);
}
int []num1 = new int[flag];
num1[0]=1;
for (int j = 1; j < flag; j++) {
num1[j]=num1[j-1]+2;
res = num1[j]+res;
// System.out.println(num1[j]);
}
int l = num1.length-1;
int r = 1;
while (l >= 0)
{
shalou(str, num1, l);
l--;
}
while (r <= num1.length-1)
{
shalou(str, num1, r);
r++;
}
res =res*2+1;
System.out.println(n-res);
}
private static void shalou(String str, int[] num1, int l) {
for (int m = 0; m < num1[l]; m++) {
if (m==0)
{
for (int j = 0; j < (num1[num1.length-1]-num1[l])/2 ; j++) {
System.out.print(" ");
}
}
System.out.print(str);
}
System.out.println();
}
}