java打印可对齐的任意层数的杨辉三角形

package 打印杨辉三角;

/**
 * 
 * @author zjluoc
 *
 */
public class YangHuiTriangle {
	public static void main(String args[]) {
		printYangHuiTriangle(15);
	}

	/**
	 * 打印对应层数lines的杨辉三角形
	 * 
	 * @param lines
	 *            层数
	 */
	public static void printYangHuiTriangle(int lines) {
		// 首先定义一个二维数组用于存储每一层对应行列的数值
		long a[][] = new long[lines][lines];
		// 接着定义每一层首位和末尾均为1,此处for循环给边界赋值“1”。
		for (int i = 0; i < lines; i++) {
			a[i][0] = a[i][i] = 1;
		}
		// 接着计算从第三层开始那些由肩部两端相加的和
		for (int i = 2; i < lines; i++) {// 控制层从第三层到最后一层,2~lines-1
			for (int j = 1; j < i; j++) {// 每一层除去首尾2个数,只有(i+1)-2个数需要计算,说明j最大值为i-1
				// 计算肩部数字之和
				a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
			}
		}
		// 进行到这里已经计算好了每层的数字,现在下面开始对其进行塑造三角形形状
		int printSpaceNumber[] = countSpaceLength(a);
		for (int i = 0; i < lines; i++) {
			// 打印能居中对齐的空格
			for (int k = 0; k < printSpaceNumber[i]; k++) {
				System.out.print(" ");
			}
			for (int j = 0; j <= i; j++) {
				System.out.print(a[i][j] + "         ");
			}
			// 每层之后换行
			System.out.println();
		}

	}

	private static int[] countSpaceLength(long[][] a) {
		int numberLenthSum = 0;
		int spaceLenthSum = 0;
		int stringlength[] = new int[a.length];// 存储计算出来的每一层数字字符串+" "的字符长度
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j <= i; j++) {
				// 计算每层数字转换为字符串后长度之和
				numberLenthSum += String.valueOf(a[i][j]).length();
			}
			// 计算该一层空格长度之和
			spaceLenthSum = (i + 1) * ("         ").length();
			// 将该一层的字符串长度赋值给length[]最后一位
			stringlength[i] = numberLenthSum + spaceLenthSum;
			// 再次累积前需要清零
			numberLenthSum = spaceLenthSum = 0;
			// System.out.println("第"+(i+1)+"层总长为:"+stringlength[i]);
		}
		// 现在需要动态计算每一层前面空格数量
		int printSpaceNumber[] = new int[a.length];
		for (int i = 0; i < stringlength.length; i++) {
			//计算每一层以最低层居中所需的空格数量
			printSpaceNumber[i] = (stringlength[stringlength.length - 1] - stringlength[i]) / 2;
			// System.out.println("第"+(i+1)+"层需要打印的空格数量为:"+printSpaceNumber[i]);
		}
		return printSpaceNumber;
	}

}

这是打印10层的杨辉三角截图:

附上完整eclipse代码包下载地址:http://download.csdn.net/detail/zjluocisoftstone/9446388


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值