java程式實現列印完美對齊的楊輝三角形
阿新 • • 發佈:2019-01-30
前面寫過一篇可以對齊的楊輝三角列印,但是還是有很大缺陷。java列印可對齊的楊輝三角形
現在補充一篇列印楊輝三角形的完美對齊方案程式碼,而且對齊替代的字元可以隨時調整,不限於空格
對齊原理就是找出最大長度的資料,動態用字元給每個資料追加字元至最大資料長度,這樣每個資料長度都一致,要對齊就很簡單了;
這是用空格對齊的15層楊輝三角形package 列印楊輝三角; /** * * @author zjluoc * */ public class YangHuiTriangle { private static String singleSpaceString = " ";// 用於補齊資料空格的單個字串 public static void main(String args[]) { printYangHuiTriangle(20); } /** * 列印對應層數lines的楊輝三角形 * * @param lines * 層數 */ public static void printYangHuiTriangle(int lines) { // 首先定義一個二維陣列用於儲存每一層對應行列的數值 long yh[][] = new long[lines][lines]; // 接著定義每一層首位和末尾均為1,此處for迴圈給邊界賦值“1”。 for (int i = 0; i < lines; i++) { yh[i][0] = yh[i][i] = 1; } // 接著計算從第三層開始那些由肩部兩端相加的和 for (int i = 2; i < lines; i++) {// 控制層從第三層到最後一層,2~lines-1 for (int j = 1; j < i; j++) {// 每一層除去首尾2個數,只有(i+1)-2個數需要計算,說明j最大值為i-1 // 計算肩部數字之和 yh[i][j] = yh[i - 1][j - 1] + yh[i - 1][j]; } } /* * 進行到這裡已經計算好了每層的數字,現在下面開始對其進行塑造三角形形狀 */ // 獲得調整後的相同資料長度的二維字元資料陣列 String[][] adjustedNumberStringArray = adjustDigitalLength(yh, singleSpaceString); // 獲取單個數據字串長度作為單個需要列印補齊的空格長度 int time = adjustedNumberStringArray[0][0].length() - singleSpaceString.length(); if (time > 0) { StringBuilder sb = new StringBuilder(singleSpaceString); for (int i = 0; i < time; i++) { sb.append(singleSpaceString); } singleSpaceString = sb.toString(); } for (int i = 0; i < adjustedNumberStringArray.length; i++) { // 列印每行資料首個數據補齊字元singleSpaceString for (int k = 0; k < adjustedNumberStringArray.length - i - 1; k++) { System.out.print(singleSpaceString); } for (int j = 0; j <= i; j++) { // 列印每個字元資料+singleSpaceString,最後一個數據不加 if (j != i) { System.out.print(adjustedNumberStringArray[i][j] + singleSpaceString); } else { // 每層結束後換行 System.out.println(adjustedNumberStringArray[i][j]); } } } } /** * 找出原始資料中最大位元組長度,再對原來每個資料動態調整資料位元組長度使其保持一致 * * @param yh * 楊輝三角原始資料二維陣列 * @return String[][] 調整長度後的資料字串二維陣列 */ private static String[][] adjustDigitalLength(long[][] yh, String singleSpaceString) { // 找出最長的資料字串長度 int maxNumberStringLength = 0; // 儲存長度調整後的資料字串二維陣列 String[][] numberStringArray = new String[yh.length][yh.length]; for (int i = 0; i < yh.length; i++) { for (int j = 0; j <= i; j++) { // 每層數字轉換為字串後計算長度,取得最大的資料字串長度 numberStringArray[i][j] = String.valueOf(yh[i][j]); if (String.valueOf(yh[i][j]).length() > maxNumberStringLength) { maxNumberStringLength = String.valueOf(yh[i][j]).length(); } } } // 用空格補齊資料字元長度,讓每一個數據字串長度都達到最大資料字串長度 for (int i = 0; i < numberStringArray.length; i++) { for (int j = 0; j <= i; j++) { // 計算每個資料字串相差幾個空格 int spaceLength = maxNumberStringLength - numberStringArray[i][j].length(); // 用空格補齊至最大長度 if (spaceLength > 0) { StringBuilder sb = new StringBuilder( numberStringArray[i][j]); for (int k = 0; k < spaceLength; k++) { sb.append(singleSpaceString); } numberStringArray[i][j] = sb.toString(); } } } return numberStringArray; } }
這是用*代替對齊的16層楊輝三角形