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

← Problem 16  Problem 18 →
英語での数字のスペルがうろ覚えだった。
<?php

//1-20と30,40,50,60,70,80,90,100,1000 の文字数をあらかじめ覚えて置く。
// 100以上の数字には and が入る(100 で割り切れる数字を除く)
// 100以上の数字は one とか two が頭につく。
$answer = 0;

$array = array( 0   =>0, // zero だけど、使わない
		1   =>3, // one
		2   =>3, // two
		3   =>5, // three
		4   =>4, // four
		5   =>4, // five
		6   =>3, // six
		7   =>5, // seven
		8   =>5, // eight
		9   =>4, // nine
		10  =>3, // ten
		11  =>6, // eleven
		12  =>6, // twelve
		13  =>8, // thirteen
		14  =>8, // fourteen
		15  =>7, // fifteen
		16  =>7, // sixteen
		17  =>9, // seventeen
		18  =>8, // eighteen
		19  =>8, // nineteen
		20  =>6, // twenty
		30  =>6, // thirty
		40  =>5, // forty
		50  =>5, // fifty
		60  =>5, // sixty
		70  =>7, // seventy
		80  =>6, // eighty
		90  =>6, // ninety
		100 =>7, // hundred
		1000=>8);// thousand
$and = 3;//and が入る場合

// 1000 の数字はあらかじめ加算
$answer = $array[1000] + $array[1];

for($i = 1 ; $i < 1000 ; $i++)
{
	$num = $i;
	// 100 より大きい場合
	if($num >= 100)
	{
		// 100で割り切れない場合
		if($num % 100 != 0)
		{
			$answer += $and;
		}
		//100の桁の文字を算出
		$digit3 = (int)($num / 100);
		$answer += $array[100] + $array[$digit3];

		$num -= $digit3 * 100;
	}
	// 下二けたが20より小さい場合
	if($num < 20)
	{
		$answer += $array[$num];
	}
	else
	{
		// 10 の桁の文字を算出
		$digit2 = (int)($num / 10) * 10;
		// 1 の桁の文字を算出
		$digit1 = $num - $digit2;
		$answer += $array[$digit2] + $array[$digit1];
	}
}

echo $answer;

?>
問題文