Problem:
宝探し II

蔵を片付けていたら、先祖の宝のありかへの行き方を記した古文書が見つかりました。この古文書にはおおよそ次のような事が書かれていました。

1. まず、町外れの井戸から、真東に 1m の地点に立ち、まっすぐ井戸の方向を向け。
2. 右回りに 90 度向きを変え、1m 直進したら、まっすぐ井戸の方向を向け。
3. 右回りに 90 度向きを変え、1m 直進したら、まっすぐ井戸の方向を向け。
4. 〃
5. 〃
6. ：

2 行目以降は、全く同じことが書かれていました。あなたは、宝を探そうと思いましたが、厄介なことに気がつきました。昔と違い建物が邪魔をしていて、まっすぐ井戸の方向をむこうにも井戸が見えなかったり 1m 直進しようにも直進できなかったりします。さらに、この古文書ときたら、1000 行近くあり、古文書どおりの作業をすることは、かなりの時間と体力が要ります。しかしながら、幸運なことに、あなたはコンピュータを利用することができます。

古文書に書かれている行数 n を入力して、宝のありかを出力するプログラムを作成してください。ただし、 n は 2 以上 1,000 以下の正の整数とします。

入力

複数のデータセットが与えられます。各データセットとして、古文書の行数を表す１つの整数 n が１行に与えられます。

入力は -1 で終わります。データセットの数は 50 を超えません。

出力

町外れの井戸から東に x (m)，北に y (m)の位置に宝があるとして、
各データセットごとに以下の形式で出力して下さい。

x
y

出力は実数とし、0.01 以下の誤差を含んでもよい。

Sample Input

3
6
-1

Output for the Sample Input

0.29
1.71
-2.31
0.80

参考

n =2, 3, 4, 5, 6 の宝の位置

Solution in JAVA (judge verdict: Accepted)

import java.util.*;

import java.lang.*;

import java.math.*;



public class Main {

	Scanner sc = new Scanner(System.in);

	class taple{

		double x;

		double y;

		taple(double x,double y){

			this.x = x;

			this.y = y;

		}

		taple getRightDir(){

			taple dir = new taple(-y,x);

			taple ret = new taple(0,0);

			ret.x = dir.x/Math.sqrt(dir.x*dir.x+dir.y*dir.y);

			ret.y = dir.y/Math.sqrt(dir.x*dir.x+dir.y*dir.y);

			return ret;

		}

		taple add(taple t){

			return new taple(t.x+x,t.y+y);

		}

	}

	void run(){

		taple[] t= new taple[1001];

		t[0] = new taple(1, 0);

		for(int i = 1; i < 1001; i++){

			t[i] = t[i-1].add(t[i-1].getRightDir());

//			System.out.println(i+" "+t[i-1].getRightDir().x + " "+t[i-1].getRightDir().y);

//			System.out.println(i+" "+t[i].x+" "+t[i].y);

		}

		for(;;){

			int n =sc.nextInt();

			if(n == -1) break;

			System.out.println(t[n-1].x + "\n"+t[n-1].y);

		}

	}

	public static void main(String[] args){

		Main m = new Main();

		m.run();

	}

}