杨辉三角的简单实现

注:本代码适用范围为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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容