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.io.*;

public class Main{
	public static void main(String args[]){
		try{
			new Main();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	
	public static double r = 6378.1;
	
	public Main() throws IOException{
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String line;
		
		while((line = in.readLine()) != null){
			String[] tmp = line.split(" ");
			
			double hp1 = Double.parseDouble(tmp[0]);
			double ep1 = Double.parseDouble(tmp[1]);
			double hp2 = Double.parseDouble(tmp[2]);
			double ep2 = Double.parseDouble(tmp[3]);
			
			
			if(hp1==-1.0 && ep1==-1.0 && hp2==-1.0 && ep2==-1.0) break;
			
			hp1 = 2.0 * Math.PI * hp1 / 360.0;
			ep1 = 2.0 * Math.PI * ep1 / 360.0;
			hp2 = 2.0 * Math.PI * hp2 / 360.0;
			ep2 = 2.0 * Math.PI * ep2 / 360.0;
			
			
			
			double cosd = Math.sin(hp1) * Math.sin(hp2) + Math.cos(hp1) * Math.cos(hp2) * Math.cos(ep1 - ep2);
			double dp = Math.acos(cosd);
			double dist = Math.abs(r * dp);
			
			System.out.println((int)(dist+0.5));
		}
	}
}