Problem 21
05 July 2002
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.
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Numerics; namespace Euler { class Program { static void Main(string[] args) { Func<int, int> dsum = (n => Enumerable.Range(1, n / 2).Where(x => n % x == 0).Sum()); Func<int, bool> amicable = (n => { int d = dsum(n); return d != n && dsum(d) == n; }); Console.WriteLine(Enumerable.Range(1,9999).Where(amicable).Sum()); Console.ReadKey(); } } }
; slow
(define (dsum n)
(sequence-fold + 0 (sequence-filter (lambda (x) (= 0 (modulo n x)))(in-range 1 (+ 1 (/ n 2))))))
(define (amicable n)
(let ([d (dsum n)])
(and (not (= d n))
(= (dsum d) n))))
(time (displayln (sequence-fold + 0 (sequence-filter amicable (in-range 1 10000)))))
; fast
(define (dsum n)
(for/sum ([x (in-range 1 (+ 1 (quotient n 2)))]
#:when (= 0 (modulo n x)))
x))
(define (amicable n)
(let ([d (dsum n)])
(and (not (= d n))
(= (dsum d) n))))
(time
(begin
(displayln
(for/sum ([x (in-range 1 10000)]
#:when (amicable x))
x))))
(time (displayln (sequence-fold + 0 (sequence-filter amicable (in-range 1 10000)))))Javascript
function dsum(n) {
var sum=0; for(var x=n/2;x>=1;x--) if(n%x==0) sum+=x;
return sum;
}
function amicable(n) {
var d = dsum(n);
return d != n && dsum(d) == n;
}
var sum=0; for(var x=1;x<=9999;x++) if(amicable(x)) sum+=x;
alert(sum);
'Project Euler' 카테고리의 다른 글
| Project Euler Problem 23 (0) | 2012.06.03 |
|---|---|
| Project Euler Problem 22 (0) | 2012.06.03 |
| Project Euler Problem 20 (0) | 2012.06.03 |
| Project Euler Problem 19 (0) | 2012.06.03 |
| Project Euler Problem 18 (0) | 2012.06.03 |