Openjudge 1.11 09:膨胀的木棍

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值