Duncan's blog

October 4, 2014

Project Euler: problem 21 (PHP) – Amicable numbers

Filed under: PHP,Project Euler — duncan @ 8:00 am

21I previously blogged about this Project Euler puzzle nearly 6 years ago, using ColdFusion.  This is my approach using PHP as a simple practical exercise for myself, and I’d appreciate any feedback on my PHP code.

Problem 21:

Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n).
If d(a) = b and d(b) = a, where a != b, then a and b are an amicable pair and each of a and b are called amicable numbers.

For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220.

Evaluate the sum of all the amicable numbers under 10000.

Code:

<?php
function sumFactors($x)
{ 
	$sum = 1;
	
	for ($i = 2; $i <= sqrt($x); $i++)
	{
		if ($x % $i == 0)
		{	// it's a factor
			$sum += $i;
			if ($i != ($x / $i)) {
				$sum += ($x / $i);
			}
		}
	}
	
	return $sum;
}

$sum = 0;

for ($i = 1; $i <= 9999; $i++) {
	$j = sumFactors($i);	// sum factors of i
	$k = sumFactors($j);	// sum of those factors
	
	if ($i == $k && $j != $k) {
		// amicable pair
		$sum += $j;
	}
}

echo $sum;

The code is almost identical to the CFML code I ended up with.  No new PHP functions or anything particularly interesting I learnt from doing this one again.

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

%d bloggers like this: