📜  门| GATE CS 2021 |设置 2 |第 63 题(1)

📅  最后修改于: 2023-12-03 15:28:39.105000             🧑  作者: Mango

门 | GATE CS 2021 |设置 2 |第 63 题

本题是印度计算机科学协会(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$是测试用例的数量。程序只需进行简单的数学计算,不需要占用额外的空间。