首页 > 编程语言 > 详细

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

时间:2014-02-12 00:42:58      阅读:504      评论:0      收藏:0      [点我收藏+]

注:已通过测试

题目详情:

         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,肯定不能通过求每行的数字推出第一个偶数位置,所以我多写了几行,找规律(见下图)

bubuko.com,布布扣

     规律:

     (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

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

原文:http://blog.csdn.net/chinaeran/article/details/19077229

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!