列表

详情


NC19466. 面积并

描述

cxt有一个正n边形,它的外接圆的圆心位于原点,半径为l。以原点为圆心,r为半径作一个圆,求圆和这个正n边形的面积并。

输入描述

输入三个整数n,l,r。
3<=n<=100000000
1<=l<=1000000
0<=r<=1000000

输出描述

输出一个实数,保留2位小数,表示面积并。

示例1

输入:

8 7 6

输出:

138.59

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 492K, 提交时间: 2018-09-29 19:25:10

#include<bits/stdc++.h>
using namespace std;
const double PI=acos(-1);

int main(){
	double n,l,r;
	while(~scanf("%lf%lf%lf",&n,&l,&r)){
			double h=l*cos(PI/n);
			double ans;
			if(r<h)ans=0.5*sin(2*PI/n)*n*l*l;
			else if(r>l)ans=PI*r*r;
			else{
				double sita=acos(h/r);
				ans=(sita*r*r-h*sqrt(r*r-h*h))*n+0.5*sin(2*PI/n)*n*l*l;
			}
			printf("%.2f\n",ans);
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 600K, 提交时间: 2020-02-27 21:06:42

#include<bits/stdc++.h>
using namespace std;
long double al,s,h,n,l,r,pi=acos(-1);
int main()
{
	cin>>n>>l>>r;
	if(r>=l)
	{
		printf("%.2Lf",pi*r*r);
		return 0;
	}
	h=l*cos(pi/n);
	if(r<=h) printf("%.2Lf",l*sin(pi/n)*h*n);
	else
	{
		al=acos(h/r);
		s=al*r*r-r*h*sin(al);
		printf("%.2Lf",(l*sin(pi/n)*h+s)*n);
	}
}

上一题