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

← Problem 48  Problem 50 →
<?php

// 4桁の素数を考える。1487,4817,8147 は例として挙がっているので、除外する。
$prime = array();

for($i = 1001 ; $i < 10000 ; $i += 2)
{
	if($i != 1487 and $i != 4817 and $i != 8147 and check_prime($i))
	{
		$prime[] = $i;
	}
}

$max = max($prime);
$flag = false;
foreach($prime as $k => $v)
{
	$i = 1;
	while($k - $i >= 0 and $v +  $v - $prime[$k - $i] <= $max)
	{
		$tmp = array_search($v +  $v - $prime[$k - $i],$prime);
		if($tmp !== false)
		{
			$array = array();
			for($j = 0 ; $j < 4 ; $j++)
			{
				@$array[0][substr($prime[$tmp],$j,1)]++;
				@$array[1][substr($prime[$k - $i],$j,1)]++;
				@$array[2][substr($v,$j,1)]++;
			}
			$flag2 = true;
			foreach($array[0] as $k2 => $v2)
			{
				if(@$array[1][$k2] != $v2 or @$array[2][$k2] != $v2)
				{
					$flag2 = false;
					break;
				}
			}
			if($flag2)
			{
				$flag = true;
				break;
			}
		}
		$i++;
	}
	if($flag)
	{
		break;
	}
}
echo $prime[$k - $i].$v.$prime[$tmp]."\n";

function check_prime($num)
{
        global $answer;
        $flag = true;
        if($num % 2 != 0)
        {
                // 素数チェック
                $sqrt = sqrt($num);
                for($i = 3 ;$i <= $sqrt ; $i+=2)
                {
                        if($num % $i == 0)
                        {
                                $flag = false;
                                break;
                        }
                }
        }
        else
        {
                $flag = false;
        }
        return $flag;
}

?>
問題文