轨道
/
Rust
Rust
/
练习
/
三角形
三角形

三角形

中等

说明

判断一个三角形是 equilateral、isosceles 还是 scalene。

equilateral 三角形的三条边长度相同。

isosceles 三角形至少有两条边长度相同。 (有时会规定为恰好有两条边长度相同,但在本练习中,我们认为至少有两条。)

scalene 三角形的三条边长度各不相同。

注意

一个图形要成为三角形,所有边的长度都必须大于 0,且任意两条边的长度之和必须大于或等于第三条边的长度。

Note

退化三角形 是指两条边的长度之和等于第三条边长度的三角形,例如 1, 1, 2。 本练习选择不为退化三角形加入测试。 如果你愿意,可以处理这些情况,也可以放心地忽略它们。

用等式表示:

设 a、b、c 为三角形的三条边。 那么下面三个表达式都必须成立:

a + b ≥ c
b + c ≥ a
a + c ≥ b

参见三角不等式

实现方式有很多种。下面这些主题可能会对你有帮助,具体取决于你采用的思路。

也许你还能想出完全不使用其中任何一项的思路!

非整数边长

基础练习测试的是对三边均为整数的三角形进行判定。不过,有些三角形无法用纯整数表示。一个简单的例子是两条长度均为 1 的等长边,它们之间的夹角为 90 度。它的第三条边长是 2 的平方根,这是一个无理数(也就是说,它无法写成整数或分数)。

为了同时处理整数和浮点数两种情况而重写这些分析函数,已经很繁琐了;要为所有可能的整数和浮点类型都这么做,就更加繁琐:整数的位宽有 8、16、32、64 和 128 位这几种,每种都分有符号和无符号变体,这意味着即便不把浮点数算在内,本质上相同的代码也要重新实现 10 遍!

有更好的办法:泛型。把你的 Triangle 改写成 Triangle<T>,代码就只需要写一遍,生成那些特化版本的工作则交给编译器。注意,要使用数学运算,你需要用 trait 把泛型类型约束为支持这些运算的类型。

还有一些附加测试,可以在浮点数上检验你的实现。要启用它们,请带上 generic 特性标志运行测试,像这样:

cargo test --features generic
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Rust Exercism

准备好开始 三角形 了吗?

注册 Exercism,借助 99 个练习 和真人导师指导,学习并掌握 Rust,全部免费。