Project Euler にチャレンジ:Problem 64 PHPでの解答

← Problem 63  Problem 65 →
<?php

$answer = 0;

for($i = 1 ; $i <= 10000 ; $i++)
{
	$sqrt = sqrt($i);
	// 無理数か否かをチェック
	if($sqrt != (int)$sqrt)
	{
		$tmp_array = array();
		// 23 の場合だけ考える
		// bunbo の初期値
		$tmp1 = (int)$sqrt;
		$tmp2 = 1;
		$tmp1_0 = 0;
		$tmp2_0 = 0;
		while(true)
		{
			$bunbo = ($i - $tmp1 * $tmp1) / $tmp2;
			$bunshi = $tmp1;
			$tmp3 = 0;
			while($bunshi > $sqrt * -1)
			{
				$bunshi = $bunshi -  $bunbo;
				$tmp3 ++;
			}
			$bunshi = $bunshi + $bunbo;
			$tmp3 --;
			$tmp_array[] = $tmp3;
			$tmp1 = $bunshi * -1;
			$tmp2 = $bunbo;
			if(count($tmp_array) == 1)
			{
				// 最初に出てくる $tmp1 と $tmp2 を覚える
				$tmp1_0 = $tmp1;
				$tmp2_0 = $tmp2;
			}
			// $tmp1_0 と $tmp1 , $tmp2_0 と $tmp2 の値が一致したら循環したということで、
			// ループ終了
			else if($tmp1_0 == $tmp1 and $tmp2_0 == $tmp2)
			{
				break;
			}
		}
		// 周期が奇数になる場合をカウント
		if((count($tmp_array) - 1) % 2 == 1)
		{
			$answer++;
		}
	}
}

echo $answer;

?>
問題文