1. 程式人生 > >java程式實現列印完美對齊的楊輝三角形

java程式實現列印完美對齊的楊輝三角形

前面寫過一篇可以對齊的楊輝三角列印,但是還是有很大缺陷。java列印可對齊的楊輝三角形

現在補充一篇列印楊輝三角形的完美對齊方案程式碼,而且對齊替代的字元可以隨時調整,不限於空格

對齊原理就是找出最大長度的資料,動態用字元給每個資料追加字元至最大資料長度,這樣每個資料長度都一致,要對齊就很簡單了;

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;
	}

}
這是用空格對齊的15層楊輝三角形




這是用*代替對齊的16層楊輝三角形