algorithm - F#。解决 Project Euler #3 问题时因超时而终止

标签 algorithm f# primes prime-factoring

我讲过那个问题:https://www.hackerrank.com/contests/projecteuler/challenges/euler003

我正在尝试按如下方式解决这个问题:

open System


let isPrime n =
    match n with
    | _ when n > 3L && (n % 2L = 0L || n % 3L = 0L) -> false
    | _ ->
        let maxDiv = int64(System.Math.Sqrt(float n)) + 1L
        let rec f d i = 
            if d > maxDiv then 
                true
            else
                if n % d = 0L then 
                    false
                else
                    f (d + i) (6L - i)     
        f 5L 2L

let primeFactors n =
    let rec getFactor num proposed acc =
        match proposed with
        | _ when proposed = num -> proposed::acc
        | _ when num % proposed = 0L -> getFactor (num / proposed) proposed (proposed::acc)
        | _ when isPrime num -> num::acc
        | _ -> getFactor num (proposed + 1L) acc
    getFactor n 2L []


let pe3() =
    for i = 1 to Console.ReadLine()  |> int  do
        let num = Console.ReadLine() |> int64
        let start = DateTime.Now
        primeFactors num 
            |> List.max
            |> printfn "%i" 
        let elapsed = DateTime.Now - start
        printfn "elapsed: %A" elapsed

pe3()

有我的测试结果:

  • 输入:10 输出:5 耗时:00:00:00.0562321

  • 输入:123456789 输出:3803 耗时:00:00:00.0979232

  • 输入:12345678999 输出:1371742111 耗时:00:00:00.0520280

  • 输入:987654321852 输出:680202701 耗时:00:00:00.0564059

  • 输入:13652478965478 输出:2275413160913 耗时: 00:00:00.0593369

  • 输入:9999999999999 输出:909091 耗时:00:00:00.1260673

但无论如何我都会因测试用例 5 中的超时而被终止。我能做什么?

最佳答案

有一个解决办法:

open System

let primeFactors n =
    let rec getFactor num proposed acc =
       match proposed with
       | _ when proposed*proposed > num -> num::acc
       | _ when num % proposed = 0L -> getFactor (num / proposed) proposed (proposed::acc)
       | _ -> getFactor num (proposed + 1L) acc
    getFactor n 2L []

let pe3() =
    for i = 1 to Console.ReadLine()  |> int  do
        printfn "%i" (primeFactors (Console.ReadLine() |> int64)).Head
pe3()

感谢 Will Nessrici

关于algorithm - F#。解决 Project Euler #3 问题时因超时而终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55003217/

相关文章:

f# - 将数据库记录建模为类型

algorithm - 在以一元/二进制编码时检查数字是否为质数

java - 200万以内的所有质数之和

c# - 寻找质数的程序

algorithm - 找到与两个字符串匹配的有效方法

java - 您可以将第 n 个元素移动到堆栈顶部的堆栈

C# 递归, "Data Structures and Algorithms"。该程序如何在不覆盖自身的情况下打印单独的路线?

java - 数组索引越界异常合并排序过程Java

visual-studio - F# docker 应用程序 : A function labeled with the 'EntryPointAttribute' attribute must be the last declaration in the last file. ...?

f# - 使用 Continuation Monad 的 100000 阶乘有什么问题?