📅  最后修改于: 2023-12-03 15:28:39.105000             🧑  作者: Mango
本题是印度计算机科学协会(GATE)的2021年计算机科学设置2的第63题。题目要求考生实现一个C++程序,该程序接收一个二维向量输入,并返回向量在坐标系中的角度。
给定一个二维向量$(x, y)$,该向量与$x$轴的夹角为$\theta$弧度($0 \leq \theta < 2\pi$)。编写一个C++程序,它接收向量的输入,计算$\theta$值,并输出。
输入的第一行包含一个整数$T$,表示测试用例的数量。接下来的$T$行每行表示一个测试用例,每个测试用例都是由两个整数$x$和$y$组成的二元组。
对于每个测试用例,输出一个浮点数,表示向量和$x$轴的夹角,保留到小数点后两位。
输入:
3
3 3
3 -3
-3 -3
输出:
0.79
5.50
3.93
该题需要使用向量的数学知识来计算。任何二维向量都可以写成$(x, y)$的形式。假设有一个向量$\vec{v}$,角度为$\theta$,则:
$$ \cos \theta = \frac{x}{\sqrt{x^2+y^2}} $$
$$ \sin \theta = \frac{y}{\sqrt{x^2+y^2}} $$
因此:
$$ \theta = \arctan\left(\frac{y}{x}\right) $$
需要使用C++的内置函数atan2(y, x)
来计算$\theta$值。最终的程序实现如下:
#include <bits/stdc++.h>
using namespace std;
int main(){
int T;
cin >> T;
while(T--){
int x, y;
cin >> x >> y;
double theta = atan2(y, x);
if(theta < 0) theta += 2 * acos(-1);
printf("%.2f\n", theta);
}
return 0;
}
该算法的时间复杂度为$O(T)$,其中$T$是测试用例的数量。程序只需进行简单的数学计算,不需要占用额外的空间。