1. 程式人生 > >PAT——1027. 打印沙漏

PAT——1027. 打印沙漏

數量 組成 tin 有一個 循環 不能 erl scan ann

本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印

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

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉盡可能多的符號。

輸入格式:

輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。

輸出格式:

首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

輸出樣例:

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

 1 package com.hone.basical;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * 原題目:https://www.patest.cn/contests/pat-b-practise/1025
 7  * 
 8  * @author Xia 有一個陷阱:後面的空格不能要啊 同時這種打印的問題一定要從第一行開始考慮(因為基於基礎語言打印的情況都是順序打印的)
 9  */
10 public class basicalLevel1027PrintStone {
11     public static void main(String[] args) {
12 Scanner s = new Scanner(System.in); 13 int n = s.nextInt(); 14 String e = s.next(); 15 int sum = 0; // 表示當前總共數量 16 int end = 0; // 利用end表示結束的時候總共打印多少行 17 int left = 0; // 表示剩余***的個數 18 for (int i = 0; sum < n; i++) { 19 sum = fx(i); 20 if
(sum > n) { // 如果當前sum循環中計算超過了總的n,則調出循環,並且減去當前i層總*數,同時調出循環 21 end = i - 1; 22 left = n - (sum - 4 * i - 2); 23 break; 24 } 25 } 26 // 該循環用於輸出倒三角的形狀 27 for (int j = end; j >= 0; j--) { 28 // 打印左邊的空格 29 for (int i = 0; i < (2 * end + 1 - (2 * j + 1)) / 2; i++) { 30 System.out.print(" "); 31 } 32 for (int i = 0; i < 2 * j + 1; i++) { 33 System.out.print(e); 34 } 35 System.out.println(); 36 } 37 38 // 該循環用於輸出下方的正三角形 39 for (int j = 1; j <= end; j++) { 40 for (int i = 0; i < (2 * end + 1 - (2 * j + 1)) / 2; i++) { 41 System.out.print(" "); 42 } 43 for (int i = 0; i < 2 * j + 1; i++) { 44 System.out.print(e); 45 } 46 System.out.println(); 47 } 48 49 //最後一行打印所有剩余的 * 數 50 System.out.print(left); 51 } 52 53 // 首先利用遞歸來求解sum的總和(實際上這裏不太推薦使用遞歸,可以利用一個循環來代替遞歸) 54 public static int fx(int i) { 55 if (i == 0) 56 return 1; 57 else 58 return fx(i - 1) + 4 * i + 2; 59 } 60 }





PAT——1027. 打印沙漏