题意:给出一个正多边形上的三个顶点,求这个多边形至少有几个顶点。
每个个正多边形都有一个外接圆,多边形的每条边所对应的圆心角为:1 / i * 2 * pi (i为多边形边数,pi为圆周率) 因此要求多边形的最小顶点数 可以先求出给出的三角形每条边所对应的圆心角(有可能大于pi),然后依次去除3-1000的多边形每条边对应的圆心角 如果三个结果都为整数(这里要注意精度),那么当前的边数就是我们要求的最小顶点数。#include<cstdio> #include<cmath> #include<cstring> #include<iostream> using namespace std; #define eps 1e-6 #define PI acos(-1.0) bool zero(double n){ return n<eps && n>-eps; } double dis(double x1,double y1, double x2,double y2){ return sqrt( (x2-x1) * (x2-x1) + (y2-y1) * (y2-y1) ); } double angle(double a, double b, double c ){ //圆心角是圆周角的两倍 return acos( (a*a + b*b - c*c) / (2*a*b) ); } bool check(double n){ return zero( n-(int)(n+0.5) ); } int main() { double x[3],y[3],a,b,c,A,B,C; while( scanf("%lf%lf",&x[0],&y[0]) ){ scanf("%lf%lf", &x[1], &y[1]); scanf("%lf%lf", &x[2], &y[2]); a=dis(x[0], y[0], x[1], y[1]); b=dis(x[1], y[1], x[2], y[2]); c=dis(x[2], y[2], x[0], y[0]); A=angle(a,b,c)/PI; B=angle(b,c,a)/PI; C=angle(c,a,b)/PI; int i; for(i=3;i<=1000;i++) if( check(A*i) && check(B*i) && check(C*i) ) break; cout<<i<<endl; } }