読者です 読者をやめる 読者になる 読者になる

mu chance or much chance ?

日々の戯れ言

Project Euler 21

Project Euler

Problem21を解き直しました.

  • Amicable numbers

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.

https://projecteuler.net/problem=21

問題は「10000未満の友愛数の総和を求めよ」.

def getSumDivisor(num)
	sum = 0
	i = 1
	while i * i < num do
		if num % i == 0 then
			sum += i
			sum += (num / i)
		end
		i = i + 1
	end
	
	if i * i == num then
		sum += i
	end
	return sum
end

def isAmicableNumber(num)
	pairNum = getSumDivisor(num) - num
	if pairNum == num then
		return false
	end
	return (getSumDivisor(pairNum) - pairNum) == num
end

sum = 0
for i in 1..9999 do
	if isAmicableNumber(i) then
		sum += i
	end
end

p sum