这个作者写的很详细了http://blog.csdn.net/lyy289065406/article/details/6648562
本题用通过推到公式用二分来得出解答就好。
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
const double eps =10e-8;
int dblcmp(double x){
return x<-eps?-1:x>eps;
}
int main(){
double l,n,c,r,x,s;
while(scanf("%lf %lf %lf",&l,&n,&c)!=EOF){
if(dblcmp(l)<0&&dblcmp(n)&&dblcmp(c)<0)break;
s=(1+n*c)*l;//求弧长
double low=0;//二分上下界
double high=l/2;
double mid;
while(dblcmp(high-low)>0){
mid=(low+high)/2;
r=(mid*mid+l*l/4)/(2*mid);
if(dblcmp(2*r*asin(l/(2*r))-s)<0)low=mid;//这里因为是浮点数所以不要再写成low=mid+1;···
else high=mid;
}
printf("%.3lf\n",mid);
}
return 0;
}