题目大意
给定一个三角形,每经过一次迭代,每一条边变成4条小一点的边。告诉你迭代的次数,以及边的编号,求该条边是第几次迭代出现的边。
解题思路
本题是一道数学题,用找规律的方法即可解决。
我们先来观察一下一条边在两次迭代之前的变化情况:
其中黄线为我们选中的一条边,我们并不知道它是第几次迭代产生的边。蓝线是第n次迭代后产生的新边,因此其代数为n。
假设迭代前的边为原图形中第i条边,那么迭代后对应的新图形中第4(i-1)+1 .. 4(i-1)+4这四条边。
在新的四条边中,我们可以知道4(i-1)+2和_4(i-1)+3_这两条边一定是当前迭代产生新边。同时我们可以根据其序号,算出原来的i。
由此我们可以得到结论,对于第n
次迭代后的第k
条边,若:
k mod 4 == 2或3
:则该边一定是第n次迭代产生的新边;k mod 4 == 0或1
:则该边不是第n次迭代产生的新边,且该边在第n-1次迭代中对应的是第ceil(k/4)
条边。(ceil
为上取整函数)
利用这个性质,对于给定的k
和n
,我们先判定第k
条边是否是第n
次迭代产生的新边。若是,则直接返回n
;否则我们根据第二条性质,计算出的新的k' = ceil(k/4)
,n' = n - 1
,再次代入进行计算。
我们可以写出这个递归的程序:
calc(k, n):
If (n == 0) Then
Return 0; // 若n = 0时,该边一定属于初始图形
End If
If (k mod 4 == 2 or k mod 4 == 3) Then
Return n;
End If
Return calc(ceil(k/4), n - 1);
得到了该函数,本题也就迎刃而解了。
有个数据错了,i > 3*n^4了, 已经修正。