Problem:
２都市間の距離

地球上の2 都市の北緯と東経を入力とし、地表距離を計算して出力するプログラムを作成してください。ただし、地球は半径 6,378.1 km の球とし、2 点間の地表距離とはこの球面に沿った最短距離です。また、南半球でも南緯は用いずに北緯 0 ~ -90 度を用い、グリニッジ子午線の西でも西経は用いずに東経 180 ~ 360 度を用いることとします。地表距離は km 単位で求め、小数点以下は四捨五入し、整数値として出力してください。

以下に主要都市の北緯、東経の例を示します。

地名

北緯(度)

東経(度)

東京

35.68

139.77

シンガポール

1.37

103.92

シドニー

-33.95

151.18

シカゴ

41.78

272.25

ブエノスアイレス

-34.58

301.52

ロンドン

51.15

359.82

Input

複数のデータセットの並びが入力として与えられます。入力の終わりは-1 四つの行で示されます。各データセットは以下の形式で与えられます。

a b c d

1 行に第 1 の都市の北緯 a、第 1 の都市の東経 b、第 2 の都市の北緯 c、第 2 の都市の東経 d が空白区切りで与えられます。入力はすべて実数で与えられます。

データセットの数は 30 を超えません。

Output

データセット毎に 2 都市の地表距離を１行に出力します。

Sample Input

35.68 139.77 51.15 359.82
1.37 103.92 41.78 272.25
51.15 359.82 -34.58 301.52
-1 -1 -1 -1

Output for the Sample Input

9609
15092
11112

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true) {
			double t1 = sc.nextDouble();
	        double s1 = sc.nextDouble();
	        double t2 = sc.nextDouble();
	        double s2 = sc.nextDouble();
	        if (t1 == -1 && s1 == -1 && t2 == -1 && s2 == -1) return;
			double r = 6378.1;
			double[] p = pr(t1,s1);
			double[] q = pr(t2,s2);
			double a = p[0] * q[0] + p[1] * q[1] + p[2] * q[2];
			double c = Math.acos(a);
	        double ans = r * c;
	        System.out.printf("%d\n", (int)(ans + 0.5));
		}
	}
	
	static double[] pr(double a, double b) {
		double x = Math.cos(b / 180.0 * Math.PI) * Math.cos(a / 180.0 * Math.PI);
        double y = Math.sin(b / 180.0 * Math.PI) * Math.cos(a / 180.0 * Math.PI);
        double z = Math.sin(a / 180.0 * Math.PI);
        return new double[]{x, y, z};
	}
	

}