题目
您是制盒公司的所有者。
您的公司可以生产任何相等的多边形盒子,但是很多客户希望在这些盒子中运输圆形物体。圆形是消费行业中非常普遍的形状。锡罐,眼镜,轮胎和CD就是其中的一些例子。
因此,您决定在盒子上添加此信息:可放入给定盒子的最大(直径)圆形对象。
测试用例:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class PolygonTest {
@Test
public void test1(){
//Square with sides of 5 units
Polygon poly=new Polygon(4, 5);
assertEquals("5.000", String.format("%.3f", poly.circleDiameter()));
}
@Test
public void test2() {
//Octogon with sides of 9 units
Polygon poly=new Polygon(8, 9);
assertEquals("21.728", String.format("%.3f", poly.circleDiameter()));
}
@Test
public void test3() {
//Triangle with sides of 4 units
Polygon poly=new Polygon(3, 4);
assertEquals("2.309", String.format("%.3f", poly.circleDiameter()));
}
}
解题
MY
public class Polygon {
int sides;
int sideLength;
public Polygon(int sides, int sideLength) {
this.sides = sides;
this.sideLength = sideLength;
}
public double circleDiameter(){
return sideLength / Math.tan(Math.PI/sides);
}
}
还不知道为啥用tan里用角度不行,可能是有误差较大,但是在我的IDE还是没有问题的,return sideLength / Math.tan(Math.toRadians(180/sides));
后记
这题要点数学基础,我想了老半天,捡起了高中数学知识,公式如下
半径r = (边长a/2) × cot (180/边数n)
引申一下
直径R = 边长a / Math.tan (π/边数n)
后来发现他人解题
return sideLength / Math.tan(Math.toRadians(180d/sides))
180加上一个d就好,原因不明。