
2026-07-29:三角形的内角度数。用go语言,输入是一个包含三个正整数的数组,代表三条边的长度。需要判断这三条边能否组成一个面积大于零的三角形。如果可以,就计算出这个三角形的三个内角,单位用度,并把它们从小到大排好,作为三个浮点数返回;如果不能组成这样的三角形,就返回一个空数组。最终结果的精度要求是,与标准答案的误差不超过 10⁻⁵ 即可。
sides.length == 3。
1 <= sides[i] <= 1000。
输入: sides = [3,4,5]。
输出: [36.86990,53.13010,90.00000]。
解释:
边长为 3、4、5 时,可以构成一个直角三角形。该三角形的三个内角分别约为 36.869897646°、53.130102354° 和 90°。
题目来自力扣3899。
a + b > ca + b ≤ c,说明无法构成三角形(退化或不存在),直接返回空数组a + b > c,继续执行后续计算cos(A) = (b² + c² - a²) / (2bc),其中 A 是边 a 所对的角b² + c² - a²2 × b × cacos 得到弧度值180/π 转换为度数a² + c² - b²2 × a × c180/πC = 180 - A - B[A, B, C] 的顺序返回三个角度package main
import (
"fmt"
"math"
"slices"
)
func internalAngles(sides []int) []float64 {
slices.Sort(sides)
a, b, c := sides[0], sides[1], sides[2]
if a+b <= c {
return nil
}
const rad = 180 / math.Pi
A := math.Acos(float64(b*b+c*c-a*a)/float64(b*c*2)) * rad
B := math.Acos(float64(a*a+c*c-b*b)/float64(a*c*2)) * rad
return []float64{A, B, 180 - A - B} // 小边对小角
}
func main() {
sides := []int{3, 4, 5}
result := internalAngles(sides)
fmt.Println(result)
}

# -*-coding:utf-8-*-
import math
def internal_angles(sides):
# 对边长排序
sides.sort()
a, b, c = sides[0], sides[1], sides[2]
# 三角形不等式:两边之和必须大于第三边
if a + b <= c:
return []
# 弧度转角度系数
rad_to_deg = 180.0 / math.pi
# 使用余弦定理计算角 A(对应边 a)和角 B(对应边 b)
# 注意:因为 a <= b <= c,所以 A <= B <= C,天然满足非递减顺序
A = math.acos((b*b + c*c - a*a) / (2.0 * b * c)) * rad_to_deg
B = math.acos((a*a + c*c - b*b) / (2.0 * a * c)) * rad_to_deg
# 第三个角通过三角形内角和 180 度得到
C = 180.0 - A - B
return [A, B, C]
# 测试
if __name__ == "__main__":
sides = [3, 4, 5]
result = internal_angles(sides)
print(result) 
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
std::vector<double> internalAngles(std::vector<int> sides) {
// 对边长排序
std::sort(sides.begin(), sides.end());
int a = sides[0], b = sides[1], c = sides[2];
// 三角形不等式:两边之和必须大于第三边
if (a + b <= c) {
return {};
}
// 弧度转角度系数
const double rad_to_deg = 180.0 / M_PI;
// 使用余弦定理计算角 A(对应边 a)和角 B(对应边 b)
// 因为 a <= b <= c,所以 A <= B <= C,天然满足非递减顺序
double A = acos((b*b + c*c - a*a) / (2.0 * b * c)) * rad_to_deg;
double B = acos((a*a + c*c - b*b) / (2.0 * a * c)) * rad_to_deg;
// 第三个角通过三角形内角和 180 度得到
double C = 180.0 - A - B;
return {A, B, C};
}
int main() {
std::vector<int> sides = {3, 4, 5};
std::vector<double> result = internalAngles(sides);
// 输出结果
for (double angle : result) {
std::cout << angle << " ";
}
std::cout << std::endl;
return 0;
}

·