注:本代码适用范围为Integer最大数之内的杨辉三角
部分行数的结果会扭曲,不管了(🙂)
package Test;
import java.util.Scanner;
public class PascalTriangle {
public static int getDigit(int value){
//初始化计数器
int digitCount=0;
//计算出value是几位数
while(value>=1){
value=value/10;
digitCount++;
}
return digitCount;
}
public int calTriangleMaxDigit(int[][] triangle){
//得到杨辉三角的最大值
int maxValue=triangle[triangle.length-1][triangle.length/2];
//返回杨辉三角最大的位数
return getDigit(maxValue);
}
//输出杨辉三角
public void printTriangle(int[][] triangle,int maxDigit){
//开始循环每一层
for(int i=0;i<triangle.length;i++){
//为了达到三角形的目的,第n行第m列数应该介于第n+1行第m列与第n+1行第m+1列中间处,
// 设占位数为k,则第n行第m列数在第n+1行第m列的位置后k/2处
//最后一行q前置0为0个字符,则倒数第二行q-1前置 k/2个字符,以此类推,第w行占位 (q-w)k/2个空格
for(int k=0;k<triangle.length-1-i;k++){
for(int m=0;m<maxDigit/2+1;m++){
System.out.print(" ");
}
}
for(int j=0;j<triangle.length;j++){
int value=triangle[i][j];
if(value!=0){
//得到value的位数
int digit=getDigit(triangle[i][j]);
//输出value
System.out.print(triangle[i][j]);
//为了保持位数一致,假设整个杨辉三角中最高位为n,则每一位数都需占n+1 位
//则n位数需要补充一个空格,m位数需要n+1-m个空格,以此类推 “0”位数补充n+1空格
for(int m=0;m<maxDigit-digit+1;m++){
System.out.print(" ");
}
}
}
//换行
System.out.println();
}
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
while(true){
String input=in.next();
if(input.equals("quit")){
System.out.println("结束生成杨辉三角");
break;
}else{
//输入需要生成的行数
int length=Integer.parseInt(input);
if(length<1){
System.out.println("无法生成杨辉三角!");
}
//初始化数组
int[][] triangle=new int[length][length];
//杨辉三角第一行第一数
triangle[0][0]=1;
if(length>1){
//杨辉三角第二行第一个和第二个必为2
triangle[1][0]=1;
triangle[1][1]=1;
if (length > 2) {
//遍历生成每一行
for(int i=2;i<length;i++){
//控制第n行的个数是n个
for(int j=0;j<=i;j++){
//第1个数到第n/2个数之间的赋值做法
if(j<=i/2){
if(j == 0){
//第一个数必为0
triangle[i][j]=1;
}else{
//第n行第m列值=第n-1行第m-1列+第n-1行第m列
triangle[i][j]=triangle[i-1][j-1]+triangle[i-1][j];
}
}else{
//第n/2个数之后的做法
//第m行第n个数的值与第n-m相等
triangle[i][j]=triangle[i][i-j];
}
}
}
}
}
PascalTriangle pascalTriangle=new PascalTriangle();
//输出杨辉三角
pascalTriangle.printTriangle(triangle,pascalTriangle.calTriangleMaxDigit(triangle));
}
}
}
}
结果图:
image.png
image.png