zoukankan      html  css  js  c++  java
  • [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
    
  • 相关阅读:
    float保留指定位数的小数
    springmvc中拦截器的使用
    springmvc文件上传
    spring注入
    mybatis动态代理
    2017《JAVA技术》预备作业02 计科1502 郎春雨
    2017《JAVA技术》预备作业01 计科1502 郎春雨
    字符串占位符的使用
    Pyenv虚拟环境的创建(虚拟机)
    Git的基本使用
  • 原文地址:https://www.cnblogs.com/jiangzhen/p/2330701.html
Copyright © 2011-2022 走看看