GDUT_寒假训练题解报告_专题I_J题 个人题解报告

GDUT_寒假训练题解报告_专题I_J题 个人题解报告

J题:浮点数二分

题目:

当长度为L的细杆被加热n度时,它会膨胀到新的长度L’=(1+n*C)*L,其中C是热膨胀系数。

当一根细杆被安装在两个固体壁上,然后被加热,它就会膨胀,形成一个圆形的节段,原来的节段的弦杆就是节段的弦杆。

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

输入

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

输出

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

从题目上来看,是一个L长的棒子,加热之后会有一个L`,然后求他拱高的高度,我们用物理知识不难得出,这个弧毕竟、定是一个圆弧,沿着两头切线开始处处受力平衡;

问题简化成:求一个弦长为L,对应弧长为L`的扇形,求它的 R-圆心到弦的垂线长度。

这个题目如果直接来做我们似乎找不到行之有效的方法,只有一大堆式子,但是要实现验证答案是否正确是可以做到的,我们使用对结果h二分:
每一个h对应一个R和扇形的角度Alpha:
上代码:

using namespace std;
double L,N,C;

int main()
{
	while(~scanf("%lf %lf %lf",&L,&N,&C) && L>=0 && N>=0 && C>=0)
	{
		//h的范围:0——L/2;
		double left=0,right=L/2;
		double L1=(1+N*C)*L;
		while(right-left>=1e-8)
		{
			double mid=left+(right-left)/2;

			double R=mid/2+L*L/8/mid;
			double Alpha=asin(L/(R*2));
			if(L1>2.0*R*Alpha)
			{//h小了,应该往上取
				left=mid;
			}
			else right=mid;

		}
		printf("%.3f\n",left);
	}
	return 0;

}
发布了8 篇原创文章 · 获赞 0 · 访问量 116

猜你喜欢

转载自blog.csdn.net/DevourPower/article/details/103952913