• C/C++蓝桥杯之杨辉三角


    问题描述:下面是著名的杨辉三角

                                                            1

                                                    1                1

                                            1                2               1

                                    1                3                 3               1

                            1               4                  6                  4               1

                    1                5                10                10                5                1

    ...                                                               ...                                                ...

    如果按从上到下,从左到右的顺序把所有数排成一列,则可以得到如下数列:

    1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,...

    给定一个正整数N,请你输出数列中N第一次出现是在第几个位置?

    分析:本题主要考察杨辉三角的相关知识,通过观察可以得出杨辉三角的基本性质,每个数均等于它上方两数之和。

    可以采用递推的方式从上到下计算出杨辉三角中每个元素的数值,边计算边比较。

    首先看一个杨辉三角的打印C程序(我以前写的)

    1. #include
    2. #include
    3. #define N 11//表示要打印的行数
    4. int main()
    5. {
    6. int i = 0;
    7. int j = 0;
    8. int tge[N][N];
    9. for (i = 0; i < N; i++)//先打印每一行的第一个和最后一个;
    10. {
    11. tge[i][0] = 1;
    12. tge[i][i] = 1;
    13. }
    14. for (i = 2; i < N; i++)//打印中间部分
    15. {
    16. for (int j = 1; j < i; j++)
    17. {
    18. tge[i][j] = tge[i - 1][j - 1] + tge[i - 1][j];
    19. }
    20. }
    21. for (i = 0; i < N; i++)
    22. {
    23. for (j = 0; j < 2 * (N - i); j++)
    24. {
    25. printf(" ");
    26. }
    27. for (j = 0; j <= i; j++)
    28. {
    29. printf("%4d", tge[i][j]);
    30. }
    31. printf("\n");
    32. }
    33. return 0;
    34. }

    C程序:

    1. #include
    2. #define M 20000//这里可以改变范围大小,有时题目中会给出要求
    3. int a[M][M];//用数列来存放
    4. int main()
    5. {
    6. a[1][1] = 1;
    7. int num = 1;//数的总量一开始为1
    8. int N;
    9. printf("请输入要查询的数:");
    10. scanf("%ld", &N);//N代表要查找的数
    11. for (int i = 2; i < M; i++)
    12. {
    13. for (int j = 1; j <= i; j++)
    14. {
    15. a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//每个数等于上方两数之和
    16. num++;//每算出一个数,数的总数量就加1
    17. if (a[i][j] == N)
    18. {
    19. printf("这个数的位置在第%d个", num);
    20. return 0;
    21. }
    22. }
    23. }
    24. }

    C++程序:

    1. //二分查找的方法
    2. #include
    3. using namespace std;
    4. int n;
    5. int combi(int a,int b)
    6. {
    7. int res=1;
    8. for(int i=a,j=1;j<=b;i--,j++)
    9. {
    10. res=res*i/j;
    11. if(res>n)
    12. {
    13. return res;
    14. }
    15. }
    16. return res;
    17. }
    18. bool check(int k)
    19. {
    20. int l=k*2;
    21. int r=n;
    22. while(l
    23. {
    24. int mid=(l+r)/2;
    25. if(combi(mid,k)>=n)
    26. {
    27. r=mid;
    28. }
    29. else
    30. {
    31. l=mid+1;
    32. }
    33. }
    34. if(combi(r,k)!=n)
    35. {
    36. return false;
    37. }
    38. cout<1)/2+k+1;
    39. return true;
    40. }
    41. int main()
    42. {
    43. cout<<"请输入你要查找的数:";
    44. cin>>n;
    45. for(int k=16;k>=1;k--)
    46. {
    47. if(check(k))
    48. break;
    49. }
    50. return 0;
    51. }

    以上提供了两种方法,可供大家自由选择! 

                                                                 

  • 相关阅读:
    河北建筑八大员资料员施工员劳务员题库练习
    【算法系列 | 9】深入解析查找算法之—哈希表查找
    三目运算的宏定义
    Spring Cloud Circuit Breaker 使用示例
    “先进”的飞书为何搞不定钉钉?
    redis集群主从扩容(docker中)
    typescript学习(二)
    Feign(黑马程序员)
    Knife4j使用教程(三) -- 实体类的配置注解(@ApiModel与@ApiModelProperty 的 认识与使用)
    百位上的数字(蓝桥杯真题)
  • 原文地址:https://blog.csdn.net/2301_80002696/article/details/136752978