SRM 151 DIV1 Easy - Archimedes (復習×○)

問題


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);
}

};
このエントリーをはてなブックマークに追加