-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L'=(1+n×C)×L,其中C是热膨胀系数。
当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。
你的任务是计算木棍中心的偏移距离h。
输入
- 输入包含多行,每行输入包括3个非负数:细木棍的初始长度L,温度的变化n,材料的热膨胀系数C。输入数据保证细木棍伸长的长度不会超过原长的一半,最后一行为3个-1,不做处理。 输出
- 对每一行输入,输出细木棍的中心在受热前后移动的距离,精确到小数点后3位。 样例输入
-
1000 100 0.0001 15000 10 0.00006 10 0 0.001 -1 -1 -1
样例输出
-
61.329 225.020 0.000
来源
-
POJ 1905
正解如下:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
double L,n,C,b,R,AI,b1,mid,l,r;
int main()
{
while(scanf("%lf %lf %lf",&L,&n,&C))
{
if(L==-1&&n==-1&&C==-1)
return 0;
l=0,r=L/2;
b=(1+n*C)*L;
while(r-l>=1e-4)
{
mid=(l+r)/2;
R=(mid*mid+L*L/4)/(2*mid);
AI=asin(L/2/R);
b1=2*AI*R;
if(b==b1)
break;
else if(b1<b)
l=mid;
else
r=mid;
}
printf("%.3lf\n",mid);
}
return 0;
}
谢谢!