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

← Problem 59  Problem 61 →
<?php

// 普通に全数チェックを行うと、すごく時間がかかる。
// とりあえず、合計33427 という数が見つかったので、最大素数が33427 までの間でもういっかい。

$prime = array(3=>array(0=>0));
$i = 7;
$flag = false;
$answer = array();
$max = 0;

while(true)
{
	if(check_prime($i))
	{
		$prime[$i] = array();
		foreach($prime as $k => $v)
		{
			$tmp = $i.$k;
			$tmp2 = $k.$i;
			if(check_prime($tmp) and check_prime($tmp2))
			{
				$prime[$i][] = $k;
			}
		}
		$tmp3 = array();
		if(count(@$prime[$i]) > 0)
		{
			foreach($prime[$i] as $k => $v)
			{
				$answer = array($i);
				$max = 0;
				check_len($v,$tmp3,2);
				if($max > 4)
				{
					$flag = true;
					break;
				}
				$tmp3[] = $v;
			}
		}
		if($flag)
		{
			break;
		}
	}
	$i+=2;
}

echo array_sum($answer)."\n";

function check_len($key , $array , $num)
{
	global $prime;
	global $answer;
	global $max;
	$answer[$num] = $key;
	if($max < $num)
	{
		$max = $num;
	}
	$tmp = array_intersect($prime[$key] , $array);
	if(count($tmp) > 0)
	{
		$tmp3 = array();
		foreach($tmp as $v)
		{
			if($max < 5)
			{
				check_len($v,$tmp3,$num+1);
				$tmp3[] = $v;
			}
		}
	}
}

function check_prime($num)
{
        $flag = true;
        // 素数チェック
        $sqrt = sqrt($num);
        for($i = 3 ;$i <= $sqrt ; $i+=2)
        {
                if($num % $i == 0)
                {
                        $flag = false;
                        break;
                }
        }
        return $flag;
}
?>
問題文