在 Java 學習初期,利用巢狀迴圈在控制台列印各種圖形是鍛鍊邏輯思維的經典練習。本文分享一個「數字金字塔」的完整實作,其特點是每一行呈現對稱的倍數序列(1、1 2 1、1 2 4 2 1……),並詳細解析核心算法與格式化輸出技巧。
1
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
註:控制台字體等寬特性限制,數字無法完美置中,本示例採用固定寬度右對齊方式模擬金字塔結構。
public class NumberPyramid {
public static void main(String[] args) {
// 總行數
int lineNumber = 5;
// 底數(每層遞增倍率)
int baseNumber = 2;
// 1. 預先生成每層所需的數字陣列:{1, 2, 4, 8, 16}
int[] numbers = new int[lineNumber];
numbers[0] = 1;
for (int i = 1; i < lineNumber; i++) {
numbers[i] = numbers[i - 1] * baseNumber;
}
// 2. 計算每個數字佔用的字符寬度(最大數字位數 + 2 空格間距)
int columnsPerNumber = String.valueOf(numbers[lineNumber - 1]).length() + 2;
// 3. 雙層迴圈輸出金字塔
for (int i = 0; i < lineNumber; i++) {
// 3.1 輸出前導縮進(每層遞減)
for (int j = 0; j < lineNumber - i - 1; j++) {
System.out.printf("%" + columnsPerNumber + "s", " ");
}
// 3.2 輸出左半部遞增序列 1, 2, 4...
for (int k = 0; k <= i; k++) {
System.out.printf("%" + columnsPerNumber + "d", numbers[k]);
}
// 3.3 輸出右半部遞減序列 ... 4, 2, 1
for (int m = 0; m < i; m++) {
System.out.printf("%" + columnsPerNumber + "d", numbers[i - m - 1]);
}
// 3.4 換行
System.out.println();
}
}
}
先將每行需要的數字存入陣列,避免在輸出迴圈中重複計算冪次,提升效能並簡化邏輯。
columnsPerNumber = String.valueOf(maxNumber).length() + 2
根據最大數字位數動態決定格式化寬度,確保不同行數、不同底數下對齊效果一致。
%{width}s 用於輸出固定寬度空格(縮進),%{width}d 用於右對齊輸出整數。這比手動拼接字符串更優雅、效能更好。
每行分為「縮進 → 遞增部 → 遞減部」三段,遞減部索引設計為 numbers[i - m - 1] 巧妙實現鏡像效果。
baseNumber 為 3、10 觀察不同倍率金字塔這個示例雖簡單,卻涵蓋了陣列操作、迴圈控制、格式化輸出、算法對稱性設計等 Java 基礎核心技能。掌握此類「控制台圖形輸出」題型,對於培養程式設計的邏輯嚴密性與細節把控力大有裨益。