uva 375 Inscribed Circles and Isosceles Triangles

本身是道简单题,但是因为精度问题卡了半天,以后要注意浮点数计算的时候,尽量减少复杂的浮点运算次数,以免丢失精度。

#include <stdio.h>
#include <math.h>

#define		PI		(acos(-1.0))

char buffer[100];
int case_count;

double get_r(double b, double h)
{
	//printf("b=%lf h=%lf\n", b, h);
	double r;
	double k, y;
		
	y = sqrt(b*b/4.0+h*h);
	k = b/(y*2);
	r = k*h/(k+1);
	return r;
}

void func(double b, double h)
{
	double k, r, sum;
	double result;

	r = get_r(b, h);
	sum = r;
	k = r/h;
	while(1)
	{
		h = h-2*r;
		r = h*k;
		if(r < 0.000001)
			break;

		sum += r;
	}

	result = 2*PI*sum;
	printf("%13.6lf\n", result);
}

int main(void)
{
	double b, h;

	int N;
	scanf("%d", &N);
	case_count = 0;
	while(N--)
	{
		scanf("%lf %lf", &b, &h);

		if(++case_count >= 2)
			printf("\n");
		func(b, h);
	}

	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值