2017年Java方向C组第五题

2021-03-18  本文已影响0人  D丝学编程

标题: 杨辉三角

杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要。

第0行:           1
第1行:          1 1
第2行:         1 2 1
第3行:        1 3 3 1
第4行:       1 4 6 4 1
....

两边的元素都是1, 中间的元素是左上角的元素与右上角的元素和。

我们约定,行号,列号都从0计数。
所以: 第6行的第2个元素是15,第3个元素是20

直观地看,需要开辟一个二维数组,其实一维数组也可以胜任。
如下程序就是用一维数组“腾挪”的解法。

public class A
{
    // 杨辉三角形的第row行第col列
    static long f(int row, int col){
        if(row<2) return 1;
        if(col==0) return 1;
        if(col==row) return 1;
        
        long[] a = new long[row+1];
        a[0]=1;
        a[1]=1;
        
        int p = 2;
        
        while(p<=row){
            a[p] = 1;
            for( __________________ ) a[q] = a[q] + a[q-1];
            p++;
        }
        
        return a[col];
    }
    
    public static void main(String[] args){
        System.out.println(f(6,2));
        System.out.println(f(6,3));     
    }
}

请仔细分析源码,并完成划线部分缺少的代码。
注意:只提交缺少的代码,不要提交已有的代码和符号。也不要提交说明性文字。

解析:

/*
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
 * */
// 杨辉三角形的第row行第col列
static long f(int row, int col){
    if(row<2) return 1;    //第一行和第二行全部为1
    if(col==0) return 1;   //第一列全部为1
    if(col==row) return 1;  //每行最后一列全部为1
    //以上3行代码符合的情况直接返回       
    long[] a = new long[row+1];   //定义数组存储当前行元素,元素个数=row+1
    //初始化第二行的状态,第二行2个数字都是1
    a[0]=1;    //此处a[0]=1,不但初始化第二行状态,也为后面每个循环行的第一个元素赋值1
    a[1]=1;  
    //p=2,使用p计数进行循环,意味着从第三行开始循环
    int p = 2;   //行数,在下面从第三行开始循环
    //循环行,从第三行开始循环,分别用数组记录第三行结果,
    //第四行结果由第三行结果得到
    //第五行结果由第四行结果得到
    //以此类推.......
    while(p<=row)   
    {
        a[p] = 1;  //每行的最后一个元素=1
        //当前行的数据=while上次循环行的同一列,和上一列的和
        for(int q=p-1;q>=1;q-- ) a[q] = a[q] + a[q-1];
        p++;
    }
    return a[col];
}

public static void main(String[] args){
    System.out.println(f(6,2));
    System.out.println(f(6,3)); 
}
上一篇 下一篇

猜你喜欢

热点阅读