import java.math.BigInteger;
/**
* 类名: TestYangHuiSanJiao 说明: 用三种方法输出”杨辉三角” 注: 最简单的方法就是是定义一个二维数组, 保存产生的所有”杨辉三角”值, 但是如果要输入一个比较大的”杨辉三角”(如* 100000行),就必需申请一个100000 * 100000的数组,那就需要37多G的内存,正常工作或者家用电脑应该没有能达到这个 要求的,就算是10000 * 10000 的数组也需要400M左右的内存.
* 所以,只需要记录对后面计算有用的”杨辉三角”值.
*/
public class TestYangHuiSanJiao
{
public static void main(String[] args)
{
YangHui1 yangHuiTest = new YangHui1(100);
yangHuiTest.printYangHui();
}
}
/**
* 类名: YangHui1 说明: 定义两个一维数组,分别记录上一行的值和当前行的值 注: 当前行的”杨辉三角”值完全依赖于上一行的值,而当前行的值会影响下一行的值的计算,故利用上一行的值计算当前行的值,并记录当前行的值用于下一行的计算.
*/
class YangHui1
{
BigInteger[] arr1; // 定义数组记录上一行的值;
BigInteger[] arr2; // 定义数组记录当前行的值, 计算完成后将本数组值赋给arr1,用于下一次计算
int intNum; // 记录”杨辉三角”行数
/**
* 入口参数: “杨辉三角”行数 说明: 类变量初始化过程
*/
YangHui1(int intNum) // 构造函数
{
arr1 = new BigInteger[intNum]; // “杨辉三角”一行最多有N个值,根据需要定义数组大小
arr2 = new BigInteger[intNum];
this.intNum = intNum; // 记录”杨辉三角”行数
arr1[0] = BigInteger.valueOf(1); // 每行第一个元素始终为1
arr2[0] = BigInteger.valueOf(1);
for (int i = 1; i < arr1.length; i++)
{
arr2[i] = BigInteger.valueOf(0); // 对象数组初始化过程
arr1[i] = BigInteger.valueOf(0); // 对象数组初始化过程
}
}
void printYangHui() // 计算并打印”杨辉三角”
{
System.out.println(arr2[0]); // 第一行为特殊情况,故直接打印
for (int i = 1; i < intNum; i++) // 进入循环,从第2行开始计算打印”杨辉三角”
{
System.out.print(arr2[0] + “/t”); // 打印每行第1个值
// 说明: 用上一行下标小1和同下标元素得到当前元素, 这时上一行下标小1的元素不再有价值,可以将其覆盖
for (int j = 1; j <= i; j++) // 从第2个值开始计算打印
{
arr2[j] = arr1[j – 1].add(arr1[j]); // 当前值为上一行(arr1中记录的值)中同下标与比当前下标小1的元素和
System.out.print(arr2[j] + “/t”); // 打印当前元素
arr1[j – 1] = arr2[j – 1]; // arr1中当前下标对应元素值在下一次计算中会用到, 而下标小1的元素在
// 本次计算中运用过了,所以将当前计算元素的前一元素赋给arr1
}
arr1[i] = arr2[i]; // 本行计算完毕, 将最后一个元素赋给出arr1用于下一行计算
System.out.println(); // 换行
}
}
}