题目

牛牛有一个边长为 1 的正六边形,只要牛牛一推它就可以一直滚下去,正六边形左下角为 A。
如图是正六边形翻滚一次的情况。给定正六边形翻滚次数 k,求 A 点翻滚轨迹长度。
六边形翻滚

解题思路

第 1 次翻滚的轨迹长度为 ,其中
第 2 次翻滚的轨迹长度为 ,其中
第 3 次翻滚的轨迹长度为 ,其中
第 4 次翻滚的轨迹长度为 ,其中
第 5 次翻滚的轨迹长度为 ,其中
第 6 次翻滚的轨迹长度为 0,因为此时的滚动是以 A 点为圆心的。翻滚完成后,A 点位于六边形左下角。

先计算六边形翻滚的完整的周期(即点 A 从六边形左下角翻滚至六边形左下角)次数 n。
再计算剩余的翻滚次数的轨迹长度。

C++代码

class Solution {
public:
    /**
     * 
     * @param k int整型 翻滚次数
     * @return double浮点型
     */
    double circumference(int k) {
        // write code here
        double pi = acos(-1);
        int n = k / 6;
        k %= 6;
        double r2 = sqrt(3.0);
        double ans = pi*(4+2*r2)/3*n;
        if(k==1)
            ans += pi/3;
        else if(k==2)
            ans += pi*(1+r2)/3;
        else if(k==3)
            ans += pi*(3+r2)/3;
        else if(k==4)
            ans += pi*(3+2*r2)/3;
        else if(k==5)
            ans += pi*(4+2*r2)/3;
        return ans;
    }
};