java打印杨辉三角

import java.util.Scanner;

public class ShowYangHuiTrangle {

	public static void main(String[] args) {
		
		System.out.print("请输入你要打印的层数:");
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();
		
		//定义打印杨辉三角的类
		YangHuiTrangle trangle = new YangHuiTrangle();
		System.out.println("打印的" + n + "层杨辉三角如下:");
		if (n % 2 == 0) {//行数为偶数时
			trangle.trangleOdd(n);
		} else {//行数为奇数时
			trangle.trangleEven(n);
		}

	}

}

class YangHuiTrangle {

	/**
	 * 当n为偶数时采取的策略
	 * 
	 * @param n    行数
	 */
	public void trangleOdd(int n) {
		
		// 定义需要用到的矩阵为杨辉三角元素行数和最底层元素个数*2-1
		int[][] array = new int[n][2 * n - 1];
		array[0][n - 1] = 1;// 第一行的第n-1个位起始元素置为一
		
		for (int i = 1; i < n; i++) {// 从第二行开始计算
			for (int j = 0; j < 2 * n - 1; j++) {
				
				// 如果不是每行最后一个元素则其值为上一行该位置前后两个元素和
				if (j != 0 && j != 2 * n - 2) {
					array[i][j] = array[i - 1][j - 1] + array[i - 1][j + 1];
				}
			}
		}
		
		// 最后一行第一个元素和最后一个元素置1
		lastLine(n, array);
		
		// 调整输出样式
		format(n, array);
	}

	/**
	 * 当n为奇数时采取的策略
	 * 
	 * @param n	  行数
	 */
	public void trangleEven(int n) {
		
		// 定义需要用到的矩阵为杨辉三角元素行数和最底层元素个数*2-1
		int[][] array = new int[n][2 * n - 1];
		array[0][n - 1] = 1;// 每行的第n-1个位起始元素置为一
		
		for (int i = 1; i < n; i++) {
			for (int j = 0; j < 2 * n - 1; j++) {
				if (j != 0 && j != 2 * n - 2) {
					array[i][j] = array[i - 1][j - 1] + array[i - 1][j + 1];
				}
			}
		}
		
		// 最后一行第一个元素和最后一个元素置1
		lastLine(n, array);
		
		// 调整输出样式
		format(n, array);
	}

	/**
	 * 最后一行的首尾元素均为1
	 * 
	 * @param n     行数
	 * @param array 存放三角数据的集合
	 */
	public void lastLine(int n, int[][] array) {
		array[n - 1][0] = 1;
		array[n - 1][2 * n - 2] = 1;
	}

	/**
	 * 格式化需要的输出效果
	 * 
	 * @param n		打印的行数
	 * @param array	存放打印元素的数组
	 */
	public void format(int n, int[][] array) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 2 * n - 1; j++) {
				if (array[i][j] == 0) {
					System.out.print("   ");
				} else if (array[i][j] < 10) {
					System.out.print(array[i][j] + "   ");
				} else if (array[i][j] >= 10) {
					System.out.print(array[i][j] + "  ");
				} else if (array[i][j] >= 100) {
					System.out.print(array[i][j] + " ");
				}
			}
			
			//换行
			System.out.println();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值