编程题——杨辉三角的变形
题目描述:
这里给出六层:
1 1 1 1 1 2 3 2 1 1 3 6 7 6 3 1 1 4 10 16 19 16 10 4 1 1 5 15 30 45 51 45 30 15 5 1 1 6 21 50 90 126 141 126 90 50 21 6 1
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
输入n(n <= 1000000000)
输入描述:
输入一个int整数
输出描述:
输出返回的int值
示例:
输入
4
输出
3
程序代码如下:
#include <iostream>
#include <vector>
using namespace std;
/*两种方法:
*第一种:直接求出n层的值之后再一个一个找*/
#if 0
int main()
{
int n,m,i,j;
while (cin >> n)
{
m = 2 * n - 1; //第n层有2n-1个数
vector<vector<int>>num(n, vector<int>(m,0));//n行m列数组,初始化全0
num[0][0] = 1; //第0行为1
for (i = 1; i < n; ++i) //求第1行到第n-1行的值
{
num[i][0] = num[i][2*i] = 1; //每行的第0列和最后一列都是1
for (j = 1; j < 2 * i; ++j) //求某一行第1列到第2i-1列(倒数第二列)的值
{
if (j == 1) //当前行第一列值为上一行第0列+第1列
num[i][j] = num[i - 1][j - 1] + num[i - 1][j];
else //其余列为三个数的和(左上角j-2,正上方j-1,右上角j)
num[i][j] = num[i - 1][j - 2] + num[i - 1][j - 1] + num[i - 1][j];
}
}
for (i = 1; i < m-1; ++i) //在第n行找第一个偶数的位置
{
if (!((num[n - 1][i]) & 1) && num[n - 1][i] != 0) //如果是可以被2整除且不是0说明是偶数,返回其位置
{
cout << i+1 << endl;
break;
}
}
if (i == m) //找不到返回-1
cout << -1 << endl;
}
return 0;
}
#endif
/*第二种:找规律*/
#if 1
int main()
{
int n;
while (cin >> n)
{
if (n <= 2) //前两层没有偶数
cout << -1 << endl;
else if (n & 1) //除第一层之外的奇数层:偶数在第2个位置
cout << 2 << endl;
else if (n % 4 == 0) //4的倍数层:偶数在第3个位置
cout << 3 << endl;
else //其它层(除第二层外的非4的倍数的偶数层):偶数在第4个位置
cout << 4 << endl;
}
return 0;
}
#endif
程序运行结果如下: