UVA10649 Danger Point 题解
一道非常好的几何题,适合数学很好的谷民们食用。思路上参考了 sqh_let_it_be 大佬的思路,在此表示感谢!这题公式比较多,格式可能会炸,希望审核题解的管理员通融一下,感谢!
这篇题解进行了更新(原本已通过),删去了两行无用的代码块,希望能尽快过审。
题目翻译
-
一道关于圆的几何题
-
已知
CD 和AB 长,CD 为直径,点F 为圆心,\angle ABC= 45^\circ ,求BE 长。 -
若有解,输出
BE 长;若输入的数据无解,输出INCORRECT INFORMATION !!!。
题目思路
楼上唯一一篇题解给出了证明过程,但没有对之进行解释,因此这篇题解将为您解释该过程。
这道题目主要用到的定理有以下两种:
垂径定理
-
垂径定理是数学平面几何(圆)中的一个定理;
-
垂径定理的通俗表达是:垂直于弦的直径平分弦且平分这条弦所对的两条弧。
-
拓展:一条直线,在下列五条中只要具备其中任意两条作为条件,就可以推出其他三条结论。
-
平分弦所对的优弧
-
平分弦所对的劣弧(前两条合起来就是:平分弦所对的两条弧)
-
平分弦
-
垂直于弦
-
过圆心(或是直径)
-
-
这道题中用到垂径定理的地方就是证明
AH 与HG 相等。
勾股定理
-
勾股定理,是一个基本的几何定理,指直角三角形的两条直角边的平方和等于斜边的平方。
-
中国古代称直角三角形为勾股形,并且直角边中较小者为勾,另一长直角边为股,斜边为弦,所以称这个定理为勾股定理。
-
这道题中用到勾股定理的地方较多,其中最典型的就是证明无解情况。
满分代码
加上了详细的代码注释。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
while (true)
{
double num1, num2;
cin >> num1 >> num2; // 读取输入的两个数
// 输入为0时退出循环
if (num1 == 0 && num2 == 0)
return 0;
double radius = num1 / 2; // 计算半径(直径的一半)
double diameter = num2; // 直径为输入的第二个数
double result, intermediateResult;
intermediateResult = 2 * radius * radius - diameter * diameter; // 计算中间结果
// 判断解是否存在
if (intermediateResult <= 0)
{
cout << "INCORRECT INFORMATION !!!" << endl; // 解不存在,输出错误信息
}
else
{
result = sqrt(intermediateResult); // 计算最终结果
printf("%.6lf\n", result); // 输出结果,保留小数点后6位
}
}
return 0;
}