今天看到一个有趣的题目:
1
1 1 1
1 23 2 1
1 3 676 3 1
以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,左上的数和右上数等3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。 输入n(n <= 1000000000)
看了题目,我就想模拟一下,可是一看n <= 1000000000;这就没有模拟的必要了,没那么多的空间啊...
最后,习惯性的用笔画了画,首先,左右对称是肯定的,又因为左上的数和右上数等3个数之和,所以,中间持续是奇数;
然后前两行明显都是奇数,所以返回0;
再看第二列以后的数据
1 2 3 4 5 6...所以,后面的奇数行的第二位都是偶数;
而后面的偶数行的数据是在第二位以后的(接下来才是重点):
1
1 1 1
1 2 3 2 1
1 3 6 763 1
1 41016 19
1 515 30 .....
再看每一行的第三个数据,1 3 6 10 15...这些都是1 1+2 1+2+3 1+2+3+4 1+2+3+4+5...递增相加,所以它的奇偶也是逐渐变化的,所以在偶数行中,第4 8 12 ...行的第三位都是偶数;而第6 10 14...也的第四位成功的因为前面一行的偶数成为了偶数;<暂时找不到好的规律的说,不过可以参考一下下面>
好吧,从第一行开始向下看,从左往右看四个数据,到中间为止(够四个的就看过来)
1 奇
2 奇奇
3 奇偶奇
4 奇奇偶奇
5 奇偶偶偶
6奇奇奇偶
7 奇偶奇偶
8奇奇偶奇
前面两行我就不说了,3 5 7 行也都是很明显的,第二位是偶数
由第4行到第7行,分别是奇奇偶奇 奇偶偶偶 奇奇奇偶 奇偶奇偶,而在第8行,又和第4行一样了奇奇偶奇,所以,后面的行前面4个数据也会按照这个规律下去;
好的,祭出代码:
#include <stdio.h>
#include <stdlib.h>
int run(int x)
{
if(x <= 2) //前两行直接返回0
{
return 0;
}
else if(x % 2 == 1) //奇数行第一个出现偶数为2
{
return 2;
}
else if(x % 4 == 0) // 4 8 12...在第三位
{
return 3;
}
else
return 4;
}
int main()
{
printf("%d", run(12));
return 0;
}
各位有清晰的请赐教,多谢...
不了解的也欢迎提出
欢迎各位大神指点,o(∩_∩)o