題面
分析
如圖:已知 ,M爲AB中點,N爲圓上一點,且ON垂直於AB於M,求MN
設半徑爲 , (弧度),
則可列出方程組
若求出 便可以求出x,所以我們從 入手,嘗試解上面的方程組
由(1)(2)式得
本人數學不好,求不出上面的方程的解析解(如果有解析解可以在評論中指出)
於是採用二分的方法來近似求根
顯然
由圖知 越大,
我們二分 ,設二分中點爲mid,端點爲[L,R]並計算 ,若 ,則尋找更小的,R=mid.否則尋找更大的,L=mid
還有幾個細節:
1. 一定要很精確,否則會WA
2.設定的二分誤差要儘量小
代碼
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-11
#define pi 3.141592653589793
using namespace std;
double L,n,C,theta,x;
int main(){
while(scanf("%lf %lf %lf",&L,&n,&C)!=EOF){
if(L==n&&n==C&&C==-1) break;
if(n*C==0){
printf("0.000\n");
continue;
}
double l=eps,r=pi/2;//用弧度表示角
while(fabs(l-r)>eps){
double mid=(l+r)/2;
double hu=mid/sin(mid);
if(hu>1+n*C) r=mid;
else l=mid;
}
theta=l;
double R=L/(2*sin(theta));
printf("%.3f\n",R*(1-cos(theta)));
}
}