题目

当一根长度为 L 的细棒被加热 n 度时,它会膨胀到新的长度 L'=(1+nC)L,其中 C 是热膨胀系数。
当一根细棒安装在两个实心壁上然后加热时,它会膨胀并呈现出圆段的形状,原来的棒是该段的弦。

您的任务是计算杆中心位移的距离。

输入

输入包含多行。每行输入包含三个非负数:杆的初始长度(以毫米为单位)、温度变化(以度为单位)和材料的热膨胀系数。输入数据保证杆的膨胀不会超过其原始长度的一半。输入的最后一行包含三个负数,不应对其进行处理。

输出

对于每行输入,输出一行,其中杆中心的位移以毫米为单位,精度为 3 位。

样例输入

1000 100 0.0001
15000 10 0.00006
10 0 0.001
-1 -1 -1

样例输出

61.329
225.020
0.000

分析

由题意我们能知道的量为弧长l1和弦长l,我们要求中心偏移的距离d,就要找到弧长l1和弦长l怎么与中心偏移的距离d产生联系.

如图,我们发现只要找出角度就能间接求出d
image
image
我们发现角度不能直接求出,但是有一条关于角度的关系式,于是我们可以想到二分的方法来近似出角度的大小

代码

点击查看代码
#include<stdio.h>
#include<math.h>
#define pi 3.1415926535897932384626433832

int main()
{
    double l,n,c,l1;
    while(1)
    {scanf("%lf %lf %lf",&l,&n,&c);
        if(l<0&&n<0&&c<0){break;}
        l1=(1+n*c)*l;
        double left=0,right=pi,mid;
        while(right-left>1e-12)
        {
            mid=(left+right)/2.0;
            if(l<2*l1*sin(mid/2)/mid)
            {
                left=mid;
            }else
            {
                right=mid;
            }

        }
        printf("%.3lf\n",l1/mid*(1-cos(mid/2)));
    }
    return 0;
}

这个排版有点bug

posted on 2024-11-17 12:00  不太会a  阅读(28)  评论(0)    收藏  举报