列表

详情


NC15872. 经纬度

描述

给定地球的两个经纬度坐标,问这两个点的球面距离和直线距离的差。假设地球为球体,半径为6371009米。

输入描述

第一行一个整数T表示数据组数。
接下来n行,每行四个数lat1, lng1, lat2, lng2分别表示两个点的经纬度。
正数表示北纬和东经。
负数表示南纬和西经。
数据保证合法。

输出描述

n行表示答案。
答案保留到米。

示例1

输入:

1
43.466667 -80.516667 30.058056 31.228889

输出:

802333

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 356K, 提交时间: 2018-05-04 20:09:25

#include<bits/stdc++.h>
#define db double
using namespace std;
db r=6371009,p=acos(-1.0)/180.0;
int main(){
	int cas;
	scanf("%d",&cas);
	while(cas--){
		db l1,d1,l2,d2;
		scanf("%lf%lf%lf%lf",&l1,&d1,&l2,&d2);
		l1*=p;l2*=p;
		d1*=p;d2*=p;
		db d=r*sqrt(2-2*(cos(l1)*cos(l2)*cos(d1-d2)+sin(l1)*sin(l2)));
		printf("%.0f\n",2*asin(d/2/r)*r-d);
	}
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 45ms, 内存消耗: 3448K, 提交时间: 2018-05-04 21:16:23

from math import *
R = 6371009
t = int(input())
for tt in range(t):
    a, b, c, d = map(float,input().split())
    a = (a/180)*pi
    b = (b/180)*pi
    c = (c/180)*pi
    d = (d/180)*pi
    ans = R*sqrt(2-2*(cos(a)*cos(c)*cos(b-d)+sin(a)*sin(c)))
    ans = round(2*asin(ans/(2*R))*R-ans)
    print(ans)

上一题