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

← Problem 61  Problem 63 →
<?php

// pow3 を求めた後、使っている数字が何かを記憶して、一致する数を出力する。
// 本当は最初に出てきた数より小さい数になる可能性もゼロではないので、数を覚えておいて、
// 桁数が変わるまで調べる必要があるけど、とりあえずこれで。

$answer = array();
$num = 1;
$ketasu = 0;

while(true)
{
	$tmp = pow($num,3);
	$len = strlen($tmp);
	// 桁数が異なれば、絶対に一致しないので、過去のものは消す。
	if($ketasu != $len)
	{
		$answer = array();
		$ketasu = $len;
	}
	// 1文字ずつ分解
	$answer[$num] = array();
	for($j = 0 ; $j < $len ; $j++)
	{
		@$answer[$num][substr($tmp,$j,1)]++;
	}
	$tmp2 = 0;
	$tmp3 = array();
	foreach($answer as $answer_k => $answer_v)
	{
		$flag = true;
		foreach($answer[$num] as $k => $v)
		{
			if(@$answer_v[$k] != $v)
			{
				$flag = false;
				break;
			}
		}
		if($flag)
		{
			$tmp2++;
			$tmp3[] = $answer_k;
		}
	}
	if($tmp2 == 5)
	{
		break;
	}
	$num ++;
}
echo pow($tmp3[0],3)."\n";

?>
問題文