問題
http://community.topcoder.com/stat?c=problem_statement&pm=1693&rd=4560
円周率を正多角形から求めたい。
円の外周は2*円周率*半径の長さで求められる。
このとき、正n角形を考えた時に計算できる円周率を求める。
解き方
求めたい円周率をx,半径をr、正n角形の外周をyとすると、
2*x*r=y ...①
また、正多角形のうち一つの二等辺三角形の底辺dを考えると
正n角形の外周はy= n*d
ここで、dの長さは
sinα=(d/2)/r
α=(2*Pi)/(n*2)=Pi/nであるため
d=2*r*sin(Pi/n)
y=n*2*r*sin(Pi/n) ...②
①、②より、
2*x*r=n*2*r*sin(Pi/n)
x=n*sin(Pi/n)
コード
using namespace std;
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class Archimedes {
public: double approximatePi(int numSides) {
return numSides*sin(M_PI/numSides);
}
};
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class Archimedes {
public: double approximatePi(int numSides) {
return numSides*sin(M_PI/numSides);
}
};