时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给定地球的两个经纬度坐标,问这两个点的球面距离和直线距离的差。假设地球为球体,半径为6371009米。
输入描述:
第一行一个整数T表示数据组数。 接下来n行,每行四个数lat1, lng1, lat2, lng2分别表示两个点的经纬度。 正数表示北纬和东经。 负数表示南纬和西经。 数据保证合法。
输出描述:
n行表示答案。 答案保留到米。
示例1
输入
1 43.466667 -80.516667 30.058056 31.228889
输出
802333
已知两点经纬度求两点距离
AC代码:
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
const double R=6371009;
const double PI=acos(-1);//cos PI=-1
struct node
{
double x,y,z;
node(double a=0,double b=0, double c=0):x(a),y(b),z(c){}
} ST,EN;
double turn(double deg)
{
return deg/180*PI;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double Sew, Sns, Eew, Ens;
scanf("%lf%lf%lf%lf",&Sns,&Sew,&Ens,&Eew);
Sns+= 180;
Ens+= 180;
Sew=turn(Sew);
Sns=turn(Sns);
Ens=turn(Ens);
Eew=turn(Eew);
ST.z=R*sin(Sns);
ST.y=R*cos(Sns)*sin(Sew);
ST.x=R*cos(Sns)*cos(Sew);
EN.z=R*sin(Ens);
EN.y=R*cos(Ens)*sin(Eew);
EN.x=R*cos(Ens)*cos(Eew);
double len1=sqrt((ST.x-EN.x)*(ST.x-EN.x)+(ST.y-EN.y)*(ST.y-EN.y)+(ST.z-EN.z)*(ST.z-EN.z));
double len2=2*R*asin(len1/(2*R));
printf("%lld\n",(long long)(len2-len1+0.5));
}
return 0;
}