题面
题意:有一个正n边形,它的外接圆的圆心位于原点,半径为l .以原点为圆心,r为半径作一个圆,求圆和这个正n边形的面积并。3<=n<=1e8 1<=l<=1e6 0<=r<=1e6
题解: r>=l 时 显然是大圆面积
r<=h 时 h是正n边形,每个小等腰三角形的高,h=l*cos(pi/n),(结合n边形的边长和正弦公式推下就可以了),答案显然是正n边形 (S=l*sin(pi/n)*h *n,也就是每个小的等腰三角形面积 *n)
不然图形就是正n边形每段冒出来一个小圆弧围成的面积,这个面积就用扇形面积-那块三角形的面积就可以了
另注意n是1e8 l,r是1e6 n*l*r可以有1e20了 加上小数位,double 已经要不够了
记得用 long double 和%LF输出 而不是%lf
1 #include <bits/stdc++.h> 2 #define ld long double 3 using namespace std; 4 long double S,al,s,h,n,l,r,pi=acos(-1); 5 int main() 6 { 7 cin>>n>>l>>r; 8 if (r>=l) 9 { 10 printf("%.2Lf",pi*r*r); 11 return 0; 12 } 13 h=l*cos(pi/n); 14 S=l*sin(pi/n)*h; 15 if (r<=h) printf("%.2Lf",S*n); 16 else 17 { 18 al=acos(h/r); 19 s=al*r*r-r*h*sin(al); 20 printf("%.2Lf",(S+s)*n); 21 } 22 }