1.11 09:膨胀的木棍

描述
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L’=(1+n*C)*L,其中C是热膨胀系数。

当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。

你的任务是计算木棍中心的偏移距离。

输入
三个非负实数:木棍初始长度(单位:毫米),温度变化(单位:度),以及材料的热膨胀系数。
保证木棍不会膨胀到超过原始长度的1.5倍。
输出
木棍中心的偏移距离(单位:毫米),保留到小数点后第三位。
样例输入
1000 100 0.0001
样例输出
61.329

#include <iostream>
#include <cmath> 
using namespace std;
#define PI (acos(-1))
#define eps (1e-14)
double L,n,c,d,l,an,r;	//L:木棍原始长度,n温度,c系数,d偏移距离,an弧对应的圆角的一半 ,r半径
double h,lh;	//h目标弧的长度, lh临时弧的长度 
double find(double angle)
{
    
    
	double an = angle/2;
	double hh;
	r = l/sin(an);	//根据正弦函数推导 
	hh = r*angle;	//根据弧长、周长和圆心角的比例关系推导,注意:2π=360 ° 
	return hh;
}
int main()
{
    
    
	/*
		思路:对圆心角进行二分 ,角度越大弧长越大, 圆心角最小值为0,最大值为π 
	*/ 	
	double min_angle, mid_angle, max_angle;//角度的最小值、中间值、最大值 
	cin>>L>>n>>c;
	if(n*c*L<=eps)
	{
    
    
		printf("0.000\n");
		return 0;
	}
	l=L/2;
	h=(1+n*c)*L;
	min_angle = 0;
	max_angle = PI;
	while(min_angle+eps<max_angle)
	{
    
    
		mid_angle = (min_angle+max_angle)/2;
		lh = find(mid_angle);
		if(lh<h)
		{
    
    
			min_angle = mid_angle; 
		} else if(lh>=h)
		{
    
    
			max_angle = mid_angle;
		}
	}
	d = r-sqrt(r*r-l*l);
	printf("%.3f",d);
	return 0;	
}

猜你喜欢

转载自blog.csdn.net/yansuifeng1126/article/details/112283556