OJ 10705 - 向量夹角计算
题目描述
输入维数 n(2 ≤ n ≤ 100),再输入两个 n 维向量在某直角坐标系内的坐标,输出它们的夹角。
输入格式
第 1 行,输入一个整数 n,代表维数。
第 2 行,输入 n 个整数,代表第一个向量的坐标。
第 3 行,输入 n 个整数,代表第二个向量的坐标。
输出格式
输出一行,为两向量的夹角(角度而非弧度),保留两位小数。
解析
令
其中:
弧度转角度:乘以 180,再除以圆周率。
答案
c
#include <stdio.h>
#include <math.h>
#define MAX_DIM 100
// 判断是否为零向量
int is_zero_vector(const double v[], int n) {
for (int i = 0; i < n; i++) {
if (fabs(v[i]) > 1e-10) return 0; // 使用小阈值判断是否为 0
}
return 1;
}
double dot_product(const double a[], const double b[], int n) {
double sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i] * b[i];
}
return sum;
}
double vector_length(const double v[], int n) {
return sqrt(dot_product(v, v, n));
}
int main(void) {
int n;
double v1[MAX_DIM], v2[MAX_DIM];
scanf("%d", &n);
if (n < 2 || n > MAX_DIM) {
return 1;
}
for (int i = 0; i < n; i++) {
scanf("%lf", &v1[i]);
}
for (int i = 0; i < n; i++) {
scanf("%lf", &v2[i]);
}
if (is_zero_vector(v1, n) || is_zero_vector(v2, n)) {
return 1;
}
double cos_theta = dot_product(v1, v2, n) /
(vector_length(v1, n) * vector_length(v2, n));
if (cos_theta > 1) cos_theta = 1;
if (cos_theta < -1) cos_theta = -1;
double angle = acos(cos_theta) * 180.0 / M_PI;
printf("%.2f\n", angle);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59