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