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

← Problem 64  Problem 66 →
<?php

// 1が2回続いた後、2の倍数になる。
// 1,2,1,1,4,1,1,6,1,1,8
// 分母は (前の分母 × 順列1,2,1,1,4...) + (前の前の分母)
// 分子は (前の分子 × 順列1,2,1,1,4...) + (前の前の分子)
// $bunbo = array(1=>1,2=>1);
// 片方だけで完結できるので、求めるのは分子だけ

$bunshi = array(1=>array(0=>2),2=>array(0=>3));
$pow10 = pow(10,10);

for($i = 3; $i <= 100 ; $i++)
{
	// 連分数の作成
	// (2 + 1/1) = 3/1;
	// (2 + 1/(1+1/2)) = 2 + 1/(3/2) = 2 + 2/3 = 8/3
	// (2 + 1/(1+1/(2 + 1/1)) = 2 + 1/(1+1/3) = 2 + 1/(4/3) = 2 + 3/4 = 11/4
	if($i % 3 == 0 )
	{
		for($j = 0 ; $j < count($bunshi[$i - 1]) ; $j++)
		{
			$bunshi[$i][$j] = $bunshi[$i - 1][$j] * 2 * (int) ($i / 3) + $bunshi[$i -2][$j];
		}
		//$bunbo[$i] = $bunbo[$i - 1] * 2 * (int)($i / 3) + $bunbo[$i -2];
	}
	else
	{
		for($j = 0 ; $j < count($bunshi[$i - 1]) ; $j++)
		{
			@$bunshi[$i][$j] = $bunshi[$i - 1][$j] + $bunshi[$i -2][$j];
		}
		//$bunbo[$i] = $bunbo[$i - 1] + $bunbo[$i -2];
	}
	foreach($bunshi[$i] as $k => $v)
	{
		while($v >= $pow10)
		{
			@$bunshi[$i][$k+1]++;
			$bunshi[$i][$k] -= $pow10;
			$v -= $pow10;
		}
	}
}

$answer = 0;
foreach($bunshi[count($bunshi)] as $v)
{
	$len = strlen($v);
	for($i = 0 ; $i < $len ; $i++)
	{
		$answer += substr($v,$i,1);
	}
}
echo $answer."\n";
?>
問題文