[projecteuler.net] 5;6;9

5
欧几里德求最小公约数法
f#实现:
///Euclidean algorithm
///http://en.wikipedia.org/wiki/Euclidean_algorithm
///求 A B的最大公约数
///使用辗转相减法
///原始的欧几里算法是:
///设C为最大公约数
///A=aC    B=bC
///gcd( A,B) => gcd(A-B,B)  [a>b]  及gcd( (a-b)C , B) 不断的用大的减去小的。直到a-b =1那么就得到C了
let rec gcd a b =
        match a with
        | x when x=0I -> b
        | _ -> gcd (b%a) a
有了最小公约数最小公倍数就简单了
let  lcm a b =
        a*b/ (gcd a b)
第五题题目是求1到20的最小公倍数
那么只要这样既可:
let rec lcms xs =
        match xs with
        | a:: b::t-> lcms (lcm a b::t)
        | a::[]         -> a
lcms [1..20]    
================================================================================================

6

记两个公式先:
 
(1+2+3...+n)^2 = ((1+n)*n/2)^2
 
(1^2 + 2^2 + 3^2 +...+ n^2) = 1/6 * n(n+1)(2n+1) 
 
===============================================================================================

9

///A Pythagorean triplet  Check
let isPt a b c =
        a*a+b*b=c*c
let sumEq1000 a b c= a+b+c=1000
 
let help predicate =
        let mutable ret=[]
        for a in 1 ..998 do
                for b in (a+1)..999 do
                        for c in (b+1)..1000 do
                                if isPt a b c && predicate a b c then ret<-(a,b,c)::ret
        ret
 
let findPt =help sumEq1000

///prie解法: http://projecteuler.net/thread=9
///Without programming:
///
///a= 2mn; b= m^2 -n^2; c= m^2 + n^2;
///a + b + c = 1000;
///
///2mn + (m^2 -n^2) + (m^2 + n^2) = 1000;
///2mn + 2m^2 = 1000;
///2m(m+n) = 1000;
///m(m+n) = 500;
///
///m>n;
///
///m= 20; n= 5;
///
///a= 200; b= 375; c= 425;
/// Pythagorean triplet k will be:
/// k { m^2 - n^2, 2 m n , m^2 + n^2 } 
/// x = a + b + c 
let ptPire x =
        let mutable ret=[]
        for m in 1..x/2 do
                for n in 1..m-1 do
                        let a =m*m-n*n in
                        let b =2*m*n in
                        let c =m*m+n*n in
                        if a+b+c=x && a*a+b*b=c*c then ret <- (a,b,c)::ret
        ret
原文地址:https://www.cnblogs.com/jiangzhen/p/2330701.html