Loading... 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ``` ***** *** * *** ***** ``` 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。 ## 输入格式: 输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。 ## 输出格式: 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。 ## 输入样例: ``` 19 * ``` ## 输出样例: ``` ***** *** * *** ***** 2 ``` --- ## 分析: ``` … 2n-1 ***** 5 *** 3 * 1 *** 3 ***** 5 … 2n-1 ``` ### 求行数和第一层符号个数 根据上图可知构造沙漏的符号总数为 $1+2\times(3+5+…+2n+1)=2n^2+4n+1$ 。 可通过求解 $2n^2+4n+1<N(N为输入的正整数)$ 得到n的最大值,同时也得到第一行的符号个数为 $2n+1$ 。 ### 打印沙漏 可以通过输出一个缺一个尖的倒三角和一个正三角来完成沙漏的打印。 --- ``` import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); String b = sc.next(); int n = 0; //for(;2*n*n+4*n+1<=N; n++){};=>↓ //通过for循环计算出最大的 n 的值 while (2*n*n+4*n+1<=N) { n++; } n--; //因为得到的n代入式中会大于N,故须 -1 for(int i=0;i<n;i++){ for (int j = 0; j < i;j++){ System.out.print(" "); } for (int j = 0 ;j<2*n+1-2*i;j++){ System.out.printf("%s",b); } System.out.println(); } for(int i = n;i>=0;i--){ for(int j=0;j<i;j++){ System.out.print(" "); } for(int j = 0 ; j<2*n+1-2*i;j++){ System.out.printf("%s",b); } System.out.println(); } System.out.println(N-(2*n*n+4*n+1)); } } ``` © From the Internet Like 0 If you think my article is useful to you, please feel free to appreciate