问题描述:下面是著名的杨辉三角
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程序(我以前写的)
- #include
- #include
- #define N 11//表示要打印的行数
- int main()
- {
- int i = 0;
- int j = 0;
- int tge[N][N];
- for (i = 0; i < N; i++)//先打印每一行的第一个和最后一个;
- {
- tge[i][0] = 1;
- tge[i][i] = 1;
- }
- for (i = 2; i < N; i++)//打印中间部分
- {
- for (int j = 1; j < i; j++)
- {
- tge[i][j] = tge[i - 1][j - 1] + tge[i - 1][j];
- }
- }
- for (i = 0; i < N; i++)
- {
- for (j = 0; j < 2 * (N - i); j++)
- {
- printf(" ");
- }
- for (j = 0; j <= i; j++)
- {
- printf("%4d", tge[i][j]);
- }
- printf("\n");
- }
- return 0;
- }
C程序:
- #include
- #define M 20000//这里可以改变范围大小,有时题目中会给出要求
- int a[M][M];//用数列来存放
- int main()
- {
- a[1][1] = 1;
- int num = 1;//数的总量一开始为1
- int N;
- printf("请输入要查询的数:");
- scanf("%ld", &N);//N代表要查找的数
- for (int i = 2; i < M; i++)
- {
- for (int j = 1; j <= i; j++)
- {
- a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//每个数等于上方两数之和
- num++;//每算出一个数,数的总数量就加1
-
- if (a[i][j] == N)
- {
- printf("这个数的位置在第%d个", num);
- return 0;
- }
- }
- }
- }
C++程序:
- //二分查找的方法
- #include
- using namespace std;
- int n;
- int combi(int a,int b)
- {
- int res=1;
- for(int i=a,j=1;j<=b;i--,j++)
- {
- res=res*i/j;
- if(res>n)
- {
- return res;
- }
- }
- return res;
- }
-
- bool check(int k)
- {
- int l=k*2;
- int r=n;
- while(l
- {
- int mid=(l+r)/2;
- if(combi(mid,k)>=n)
- {
- r=mid;
- }
- else
- {
- l=mid+1;
- }
- }
- if(combi(r,k)!=n)
- {
- return false;
- }
- cout<
1)/2+k+1; - return true;
- }
- int main()
- {
- cout<<"请输入你要查找的数:";
- cin>>n;
- for(int k=16;k>=1;k--)
- {
- if(check(k))
- break;
- }
- return 0;
- }
以上提供了两种方法,可供大家自由选择!