การสร้างพีระมิดตัวเลข (Number Pyramid Pattern) ใน Java
รูปแบบพีระมิดตัวเลขแสดงตัวเลขเพิ่มขึ้นถึงจุดกึ่งกลาง แล้วลดลง สมมาตรทั้งสองข้าง ใช้ Nested Loops ควบคุมช่องว่างและลำดับตัวเลข
อัลกอริทึม
- รับจำนวนแถว
n - ลูปแถว i = 1 ถึง n
- พิมพ์ช่องว่างหน้า: n - i ช่อง
- พิมพ์ตัวเลขเพิ่ม: i ถึง 2*i-1
- พิมพ์ตัวเลขลด: 2*i-2 ถึง i
- ขึ้นบรรทัดใหม่
ตัวอย่างที่ 1: รับค่าจากผู้ใช้ (Scanner)
import java.util.Scanner;
public class NumberPyramid {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("ป้อนจำนวนแถว: ");
int n = scanner.nextInt();
System.out.println("รูปแบบพีระมิดตัวเลข:");
for (int i = 1; i <= n; i++) {
// ช่องว่างหน้า
for (int space = 1; space <= n - i; space++) {
System.out.print(" ");
}
// ตัวเลขเพิ่ม: i, i+1, ..., 2*i-1
for (int j = i; j <= 2 * i - 1; j++) {
System.out.print(j + " ");
}
// ตัวเลขลด: 2*i-2, ..., i
for (int j = 2 * i - 2; j >= i; j--) {
System.out.print(j + " ");
}
System.out.println();
}
}
}
ตัวอย่างที่ 2: ค่าคงที่ (Hardcoded) - ตรงกับต้นฉบับ
public class NumberPyramid {
public static void main(String[] args) {
int n = 8;
int k = 0, count = 0, temp = 0;
System.out.println("จำนวนแถว: " + n);
System.out.println("รูปแบบพีระมิด:");
for (int i = 1; i <= n; i++) {
for (int space = 1; space <= n - i; space++) {
System.out.print(" ");
count++;
}
while (k != 2 * i - 1) {
if (count <= n - 1) {
System.out.print((i + k) + " ");
count++;
} else {
temp++;
System.out.print((i + k - 2 * temp) + " ");
}
k++;
}
temp = count = k = 0;
System.out.println();
}
}
}
ผลลัพธ์ (n=5)
รูปแบบพีระมิดตัวเลข:
1
2 3 2
3 4 5 4 3
4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5
การปรับปรุง: ใช้ StringBuilder และ Logic ชัดเจนกว่า (Java 11+)
public class NumberPyramidModern {
public static void main(String[] args) {
int n = 8;
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
// ช่องว่างหน้า
sb.append(" ".repeat(n - i));
// ตัวเลขเพิ่ม
for (int j = i; j <= 2 * i - 1; j++) {
sb.append(j).append(" ");
}
// ตัวเลขลด
for (int j = 2 * i - 2; j >= i; j--) {
sb.append(j).append(" ");
}
sb.append("\n");
}
System.out.print(sb.toString());
}
}
รูปแบบแปรผัน: Pascal's Triangle (พีระมิดปาสคาล)
public class PascalsTriangle {
public static void main(String[] args) {
int n = 6;
for (int i = 0; i < n; i++) {
System.out.print(" ".repeat(n - i - 1));
int val = 1;
for (int j = 0; j <= i; j++) {
System.out.print(val + " ");
val = val * (i - j) / (j + 1); // สูตรคอมบิเนชัน
}
System.out.println();
}
}
}
ผลลัพธ์ Pascal's Triangle (n=6)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
การวิเคราะห์
- Time: O(n²)
- Space: O(1) เพิ่มเติม
- รูปแบบต้นฉบับใช้ตัวแปร k, count, temp ค่อนข้างซับซ้อน วิธีแยก loop เพิ่ม/ลด เข้าใจง่ายกว่า