明显最小正多边形在三角形外接圆上,我们只要求圆心角的一小块,再x份数
且最小就是要边数越多(圆心角越小),可以看出多边形就越接近圆(面积越大)
数据会给三点坐标。三条边就出来了
三条边出来了我们就可以算出每条边对应的圆心角
然后就gcd(圆心角)g
圆心角小份面积/
份数
#include <bits/stdc++.h> using namespace std; const double pi=3.1415926535, ACC=2*pi/100;//这里最小应该这样写,题目说最小100边,圆心角最多100份,太小如1e-6会出错 double x[3],y[3],edge[3],p,tmp,s,r,a,b,c,angle[3],gcdt,sums; double gcd(double a,double b){ if(fabs(a)<ACC) return b; if(fabs(b)<ACC) return a; return gcd(b,fmod(a,b)); } int main(int argc, char** argv) { for(int i=0;i<3;i++){ cin>>x[i]>>y[i]; } for(int i=0;i<2;i++){ edge[i]=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1])); p+=edge[i]; } edge[2]=sqrt((x[2]-x[0])*(x[2]-x[0])+(y[2]-y[0])*(y[2]-y[0])); p+=edge[2]; p/=2; tmp=1; for(int i=0;i<3;i++) tmp*=p-edge[i]; s=sqrt(p*tmp); r=edge[0]*edge[1]*edge[2]/s/4; for(int i=0;i<2;i++){ angle[i]=acos(1-edge[i]*edge[i]/2/r/r); } angle[2]=2*pi-angle[0]-angle[1]; gcdt=gcd(angle[0],gcd(angle[1],angle[2])); sums=pi*r*r*sin(gcdt)/gcdt; printf("%.6lf\n",sums); return 0; }
这里注意下double的gcd:gcd(b,a%b)
由于是小于100边的,所以gcd圆心角就应该小于2π/100,如果太小了就会出错:比如本来最小的2π/90,但精度太小gcd变成2π/810
fmod(a,b)就是a/b的余数