描述
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L’=(1+n*C)*L,其中C是热膨胀系数。
当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。
你的任务是计算木棍中心的偏移距离。
输入
三个非负实数:木棍初始长度(单位:毫米),温度变化(单位:度),以及材料的热膨胀系数。
保证木棍不会膨胀到超过原始长度的1.5倍。
输出
木棍中心的偏移距离(单位:毫米),保留到小数点后第三位。
样例输入
1000 100 0.0001
样例输出
61.329
#include <iostream>
#include <cmath>
using namespace std;
#define PI (acos(-1))
#define eps (1e-14)
double L,n,c,d,l,an,r; //L:木棍原始长度,n温度,c系数,d偏移距离,an弧对应的圆角的一半 ,r半径
double h,lh; //h目标弧的长度, lh临时弧的长度
double find(double angle)
{
double an = angle/2;
double hh;
r = l/sin(an); //根据正弦函数推导
hh = r*angle; //根据弧长、周长和圆心角的比例关系推导,注意:2π=360 °
return hh;
}
int main()
{
/*
思路:对圆心角进行二分 ,角度越大弧长越大, 圆心角最小值为0,最大值为π
*/
double min_angle, mid_angle, max_angle;//角度的最小值、中间值、最大值
cin>>L>>n>>c;
if(n*c*L<=eps)
{
printf("0.000\n");
return 0;
}
l=L/2;
h=(1+n*c)*L;
min_angle = 0;
max_angle = PI;
while(min_angle+eps<max_angle)
{
mid_angle = (min_angle+max_angle)/2;
lh = find(mid_angle);
if(lh<h)
{
min_angle = mid_angle;
} else if(lh>=h)
{
max_angle = mid_angle;
}
}
d = r-sqrt(r*r-l*l);
printf("%.3f",d);
return 0;
}