2016-08-13
UVA - 375 Inscribed Circles and Isosceles Triangles
題目大意:等腰三角形給出底邊和高,首先求內切圓 r1 ,再求切兩腰和 r1 的圓 r2 ,同理求 r3 ……知道圓的半徑小於0.000001。求這些圓的周長和。
解題思路:我們可以求出腰長 tmp = srqt( y * y + x * x / 4) , 內切圓半徑 r = 2*s/ c(c是周長) = x * y / (2 * tmp + x)。後面的每一個圓要切前一個圓和兩腰,過前一個圓作直線平行底邊,上面的小三角行和整個三角形相似,而且每個小三角形和比它大的那個的比例都是想同的,所以兩個r的比例也是相同的。這個比例k = (y - r * 2) / y;
注意:圓周率不要手打3.1415926……,用cmath裏面的 acos(-1.0) 。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main() {
int n;
scanf("%d", &n);
while ( n-- ) {
double x, y, PI = acos(-1.0);
scanf("%lf%lf", &x, &y);
double tmp, r, k, sum = 0;
tmp = sqrt(y * y + x * x / 4);
r = x * y / (2 * tmp + x);
k = (y - 2 * r) / y;
while ( r > 0.000001 ) {
sum += 2 * PI * r;
r *= k;
}
printf("%13.6lf\n", sum);
if ( n )
cout << endl;
}
return 0;
}