zoukankan      html  css  js  c++  java
  • 2017蓝桥杯杨辉三角(C++C组)

    题目:

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


    第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


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


    // 杨辉三角的第row行,第col列 
    long long f(int row, int col){
    if(row<2) return 1;
    if(col==0) return 1;
    if(col==row) return 1;

    long long a[1024];
    a[0]=1;
    a[1]=1;
    int p = 2;
    int q;

    while(p<=row){
    a[p] = 1;
    for( _________________ ) a[q] = a[q] + a[q-1]; //填空
    p++;
    }

    return a[col];
    }


    int main()
    {
    printf("%d ", f(6,2));
    printf("%d ", f(6,3));
    printf("%lld ", f(40,20));
    return 0;
    }




    请仔细分析源码,并完成划线部分缺少的代码。

    注意:只提交缺少的代码,不要提交已有的代码和符号。也不要提交说明性文字。


    解析:观察题目给出的代码,我们不难看出该做法的思路是利用行的叠加,实现不同行号同列号数据的变动,观察需要填空的下一行代码 a[j] = a[j] + a[j - 1] 可以看出,它这好像自动识别左边代表的行号在右边代表的行号的下一行,咦?这有猫腻,如果单纯的for(int i = 0;i < n;i++)这样很显然不能智能识别行号,是不是?对滴,就是for语句倒循环!

    代码:

    #include<stdio.h>
    long long f(int row, int col){

    if(row<2) return 1;
    if(col==0) return 1;
    if(col==row) return 1;

    long long a[1024];
    a[0]=1;
    a[1]=1;
    int p = 2;
    int q;

    while(p<=row){
    a[p] = 1;
    for(q = p - 1;q > 0;q--) 
    a[q] = a[q] + a[q-1]; //填空
    p++;
    }

    return a[col];
    }


    int main()
    {
    printf("%d ", f(6,2));
    printf("%d ", f(6,3));
    printf("%lld ", f(40,20));

    return 0;
    }

  • 相关阅读:
    net core 3.1 依赖注入
    vue temeplete standard
    net core 3.1 Global
    vue Multiple selection
    c# mvc modelstate
    vue temeplete
    vue element pickdate combox input 排版
    c# 生成 验证码
    vue checkbox ajax
    js算法(2)
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700748.html
Copyright © 2011-2022 走看看