给了一个正多边形的三个顶点,求满足条件的最小边数的正多边形。一开始没考虑周全,自己意淫了一个算法,果断是错的,样例都跑不出来,后来看了一下大牛的解题报告,说让用浮点数gcd做,一试,还真好使。A了之后发现好像还可以把浮点数都扩大一百万倍按整数gcd做。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double PI = 2.*asin(1.);
const double eps = 1e-3;
struct Point{
double x,y;
}p[3];
double dis(Point a,Point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double deg(double a,double b,double c){
return acos((a*a+b*b-c*c)/2./a/b);
}
double fgcd(double a,double b){
return b>eps?fgcd(b,fmod(a,b)):a;
}
int main(){
//freopen("in.in","r",stdin);
int T;
double ans,l[3],d[3];
scanf("%d",&T);
while(T--){
for(int i=0;i<3;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=0;i<3;i++)
l[i]=dis(p[(i+1)%3],p[(i+2)%3]);
ans=2.*PI;
for(int i=0;i<3;i++){
d[i]=2.*deg(l[(i)%3],l[(i+1)%3],l[(i+2)%3]);
ans=fgcd(ans,d[i]);
}
printf("%d\n",(int)(2.*PI/ans));
}
return 0;
}