我本来的想法求这个三角形的外心~~ 可以得到三条边对应圆心角 则这个正多边形的一条边对应的圆心角 应可以整除这三个角
但是一开始 没想到暴力枚举边数n, 还用模板求圆心坐标 然后求圆心角 导致误差比较大 实际上圆心角是圆周角的两倍 ~~~ 初中知识 只要求三角形的三个内角就可以
然后暴力枚举~~~~
#include <iostream>
#include <cstdio>
#include <cmath>
#define esp 1e-7
using namespace std;
const double pi = acos(-1.0);
struct Point
{
double x;
double y;
};
double Dis(Point p, Point q)
{
double dx=p.x-q.x;
double dy=p.y-q.y;
return sqrt(dx*dx+dy*dy);
}
double getangle(Point a, Point b, Point c)
{
double d1 = Dis(a, b), d2 = Dis(a, c), d3 = Dis(b, c);
return (d1*d1 + d2*d2 - d3*d3)/(2*d1*d2);
}
int main()
{
Point p[3];
while(scanf("%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y) == 6)
{
double ans1,ans2,ans3;
ans1 = acos(getangle(p[0], p[1], p[2]));
ans2 = acos(getangle(p[0], p[2], p[1]));
ans3 = acos(getangle(p[2], p[1], p[0]));
for(int i = 3; i <= 1000; i++)
{
if(fabs(ans1*i/pi - (int)(ans1*i/pi+esp)) < esp && fabs(ans3*i/pi - (int)(ans3*i/pi+esp)) < esp && fabs(ans2*i/pi - (int)(ans2*i/pi+esp)) < esp)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}