09:膨胀的木棍
描述
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L'=(1+n*C)*L,其中C是热膨胀系数。
当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。
你的任务是计算木棍中心的偏移距离。
保证木棍不会膨胀到超过原始长度的1.5倍。
1000 100 0.0001
61.329
题目分析:
由题目给出的公式可以求得弧长(L`)。我们可以把它看做在一个圆中:(C为圆心)。此时形成了一个扇形,将它平分为扇形ACE;连接AB,则AB垂直CE于D。此时的△ACD为直角三角形。就可以二分枚举mid(结果)的值,h=r-mid。
在Rt△ACD中,由勾股定理得:r^2=L^2+h^2。
将h=r-mid代入式子,得:r^2=L^2+(r-mid)^2=L^2+r^2+2r*mid+mid^2;
移项得:2*mid*R=L^2+mid^2;
变化得:R=(L^2+mid^2)/(2*mid);求得R。
根据反正弦定理 asin(L/r) 求得∠1的度数,即弧AE所对应的圆心角的度数。
可求得弧AE=r*∠1。
此时的AE需要和程序之前按公式算出的弧长作对比,若比原弧长大,则将mid缩小,反之增大。
程序样例:
#include<cstdio>
#include<cmath>
int main()
{
double L,C,SL,c; //浮点数
scanf("%lf%lf%lf",&L,&C,&c);
SL=(1+C*c)*L; //求得原弧长
SL/=2; //取半
L/=2; //取半
double left=0,right=L;
while(left+1e-7<=right) //保证精度
{
double mid=(left+right)/2,r,jd,SSL; //mid,r如上图,jd为∠1的度数,SSL是当前算出的弧长
r=(L*L+mid*mid)/(2*mid); //求得半径
jd=asin(L/r); //反正弦公式,在“cmath”中
SSL=r*jd;
if(SSL>SL) right=mid;
else left=mid;
}
printf("%.3lf",left); //精度足够,right或left都是最终答案
return 0;
}