杨辉三角的变形-庞果网 (C/C++)

注:已通过测试

题目详情:

         1

     1   1  1

  1  2   3  2  1

1  3  6  7  6  3  1

以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,

左上的数和右上数等3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。

输入n(n <= 1000000000)

函数头部:

C/C++:

    int run(int n);


分析

   由于 n <= 1000000000,肯定不能通过求每行的数字推出第一个偶数位置,所以我多写了几行,找规律(见下图)


     规律:

     (1). 1、2行没有偶数,返回 -1;

     (2). 奇数行第二个位置为偶数,返回 2;

     (3). 偶数行前4个位置模式重复,3 4 3 4 ... 返回 n/2 % 2 + 3。

代码实现:

int run(int x)
{
	if (x <= 2) // 1、2行都为-1
	{
		return -1;
	}
	else if (x%2 == 1) // 奇数行为 2
	{
		return 2;
	}
	// 偶数行
	return x/2 % 2 + 3;
}
    

    由于阿然吃饱了有事干,又优化了一下代码,把除法和取余操作用位操作实现,代码如下

int run(int x)
{
	if (x <= 2) // 1、2行都为-1
	{
		return -1;
	}
	else if (x & 1) // 奇数行为 2
	{
		return 2;
	}
	// 偶数行为 x/2 % 2 + 3
	return ((x >> 1) & 1) + 3;
}
// (x & 1)是按位与操作,例如(3 & 1)在二进制是(0101 & 0001),结果为1.

// (x >> 1)是把x右移1位,相当于除以2,例如(6 >> 1)表示(0110 --> 0011),结果为3.

// 这个优化基本上没什么用,而且可读性很差(如果被频繁使用,倒可以考虑)

原题地址http://hero.pongo.cn/Question/Details?ID=141&ExamID=139

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。