PAT——1027. 打印沙漏
阿新 • • 發佈:2017-12-05
數量 組成 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. 打印沙漏