POJ 1905 Expanding Rods(推公式+二分求方程解析解)

POJ 1905

题目大意

已知圆的弦长和弧长求半径

分析

这道题直接解方程不好解,可以通过数值逼近的方法来求得方程的近似解,这道题可以用二分法来逼近答案。

我一开始的做法是通过 θ 和r之间的关系对 θ 进行二分,WA,后面分析原因是可能是通过角度和边的关系来做精度达不到

sin(θ2)=L/2r2πrθ2π=r2arcsin(L/2r)=LL=(1+nC)L

后面看题解后用h和r的关系做过了

{r=4h2+L28hL=2rarcsin(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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值