package com.alg.mathproblem;
import java.util.Scanner;
/**
* 杨辉三角
*
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
* @author Administrator
*
*/
public class ExecuteThree {
public static void main(String[] args) {
System.out.println("显示层数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
showThree(n);
}
/**
*
* @param n
*/
private static void showThree(int n) {
///计算需要的数组长度
int len = n * (n + 1) / 2;
int a[] = new int[len];
///默认层数以及初始化起点a[0]=1
int level = 1;
a[0] = 1;
///每一层的起始点(start)和终结点(end)
int end = 0;
int start = 0;
///指针类型point 用于指向a[point],from start to end
int point = 0;
///flag 用于表示1作为每一层的数据的初始化项
boolean flag = false;
for (int i = 0; i < len; i++) {
///数据进入新的一层,重新计算开始点start 和 结束点 end
///然后重新赋值 a[start] 和 a[point]
///指针point 从 start 开始
///初始化内容 要通过flag关闭
if (!flag) {
end = (level + 1) * level / 2 - 1;
start = end - level + 1;
a[start] = 1;
a[end] = 1;
point = start;
flag = !flag;
}
///当前层计算结束,开启下一层数据计算level 和 开启初始化门阀flag
if (point == end) {
flag = !flag;
level++;
} else {
///如果是当前起始项,因为初始化已经赋值,直接指向下一项进行计算,跳过该项计算
if (point == start) {
point++;
continue;
}
///算法核心,中间的数目,出去start 和 end ,是上面的计算参数之和
a[point] = a[point - level] + a[point - level + 1];
point++;
}
}
flag = false;
for (int i = 0; i < len; i++) {
if (a[i] == 1 && flag || i == 0) {
System.out.println(a[i] + " ");
flag = false;
} else {
System.out.print(a[i] + " ");
flag = true;
}
}
}
}
杨辉三角【Java】
最新推荐文章于 2024-08-10 19:37:00 发布