题目链接:https://www.nowcoder.com/acm/contest/163/D
题意:给你一个正多边形的边数n,边长l,一个面积 s ,让你连接各个边的中点形成新的正n边形(这是一次操作),问你多少次操作后正n边形的面积小于等于 s 。
思路:我们可以推出正n边形的面积公式:p = (n * l * l / (2 * tan(x))) / 2; 正n边形的中心角为360 / n,x是中心角除以2。
每一次连接各个边的中点形成的新正n边形,改变的只是正n边形的边长。
根据边心距我们可以推出变换的关系是:l *= cos(x)。
在使用三角函数时 我们要将弧度(直接输入的数字是弧度)转换成角度:
角度转弧度:用角度乘以π/180
弧度转角度:用弧度乘以180/π
π 我们通常用 acos(-1.0) 来表示。
#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
int main()
{
int t;
cin >> t;
while(t--)
{
double n, l, s, p, x;
scanf("%lf%lf%lf",&n,&l,&s);
x = pi / n; //转化后的角度
p = (n * l * l / (2 * tan(x))) / 2; //原面积
int cnt = 0;
while(p > s)
{
l *= cos(x); //操作后的边长
p = ((n * l * l) / (2 * tan(x))) / 2; //操作后的面积
cnt++;
}
cout << cnt << endl;
}
}