Expanding Rods
Description ![]() When a thin rod is mounted on two solid walls and then heated, it expands and takes the shape of a circular segment, the original rod being the chord of the segment. Your task is to compute the distance by which the center of the rod is displaced. Input
The input contains multiple lines. Each line of input contains three non-negative numbers: the initial lenth of the rod in millimeters, the temperature change in degrees and the coefficient of heat expansion of the material. Input data guarantee that no rod expands by more than one half of its original length. The last line of input contains three negative numbers and it should not be processed.
Output
For each line of input, output one line with the displacement of the center of the rod in millimeters with 3 digits of precision.
Sample Input 1000 100 0.0001 15000 10 0.00006 10 0 0.001 -1 -1 -1 Sample Output 61.329 225.020 0.000 Source |
提示
题意:
一根长为L铁丝经过加热n度,它会弯曲为L‘=(1+n*c)*L的长度,c为常数,求出弯曲前与弯曲后中点上升的高度。
思路:
这题需要动手推推公式:
以L'(BCA)做弧,L(BA)做弦生成一个圆或者扇形,我们设高度为h(CD),半径为R(OA),θ为角BOD。
1.θ=(L'/2)/R
我们可以用弦长 l=(n(圆心角度数)*2*π*R)/360得出 n=l/R(2π=360°)2. sinθ=(L/2)/R
3. R^2=(R-h)^2+(L/2)^2(勾股定理)
从第3个式子可以得出 R=(L*L)/(8*h)+h/2
1,2式联立得出 sin(L'/(2*R))=L/(2*R)
还没完,因为sinx是周期函数,用二分不好找,我们要化为arcsinx才行。
L'=2*R*arcsin(L/(2*R))才是最终式子。
把R代入进行二分,循环体判断时要用精度去表示,因为都是double,精度上限设成10^-4就行了。
示例程序
Source Code
Problem: 1905 Code Length: 540B
Memory: 412K Time: 0MS
Language: GCC Result: Accepted
#include <stdio.h>
#include <math.h>
int main()
{
double L,n,c,l,r,m,a,R,L1;
scanf("%lf %lf %lf",&L,&n,&c);
while(L>=0||n>=0||c>=0)
{
l=0;
r=L/2;
L1=(1+n*c)*L;
while(r-l>=1e-4)
{
m=(l+r)/2;
R=(L*L)/(8*m)+m/2;
if(2*R*asin(L/(2*R))<L1)
{
l=m;
}
else
{
r=m;
}
}
printf("%.3f\n",m);
scanf("%lf %lf %lf",&L,&n,&c);
}
return 0;
}