题目大意
已知圆的弦长和弧长求半径
分析
这道题直接解方程不好解,可以通过数值逼近的方法来求得方程的近似解,这道题可以用二分法来逼近答案。
我一开始的做法是通过
θ
和r之间的关系对
θ
进行二分,WA,后面分析原因是可能是通过角度和边的关系来做精度达不到
⎧⎩⎨⎪⎪⎪⎪sin(θ2)=L/2r2πr⋅θ2π=r∗2arcsin(L/2r)=L′L′=(1+n∗C)L
后面看题解后用h和r的关系做过了
{r=4h2+L28hL′=2r∗arcsin(L2r)
ps:控制输出小数点位数(会四舍五入)
#include<iomanip>
cout<<fixed<<setprecision(小数点后保留位数)<<ans<<endl;
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<iomanip>
using namespace std;
const double pi=3.1415926;
double L1,n,C,L2;
double Get_r(double h)
{
double r=(4*h*h+L1*L1)/(8*h);
return r;
}
void Work()
{
double L=0;
double R=L1/2;
double M;
double r;
while(abs(R-L)>0.00000001)
{
M=(L+R)/2;
r=Get_r(M);
if(2*r*asin(L1/(2*r))<L2)L=M;
else R=M;
}
cout<<fixed<<setprecision(3)<<L<<endl;
}
int main()
{
while(scanf("%lf%lf%lf",&L1,&n,&C)!=EOF)
{
if(L1<0 && n<0 && C<0)break;
L2=(1+n*C)*L1;
Work();
}
}