关于主因子分解:Erlang的项目Euler_3

Project Euler #3 in Erlang

我正在尝试在Erlang编写项目Euler 3代码:

1
2
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-module(problem_3).
-compile(export_all).

start()->
    problem_3(600851475143, 2).

problem_3(Num, F) when Num > 1 ->
    case Num rem F of
    0 ->
        problem_3(Num / F, F);
    1 ->
        problem_3(Num, F + 1)
    end;

problem_3(Num, F) ->
    io:format("result: ~p~n", [F]).

但是我有两个关于这个代码的问题:

1
2
3
4
5
6
7
5> problem_3:start().
** exception error: no case clause matching 2
     in function  problem_3:problem_3/2

6> problem_3:problem_3(10, 2).
** exception error: bad argument in an arithmetic expression
     in function  problem_3:problem_3/2

为什么我会有这样的错误,我如何修复它?


第一个错误很容易解释:如果余数大于1,则没有子句匹配。尝试将第二个子句改为

1
2
_Else ->
         problem_3(Num, F+1)

它匹配所有余数不是零的情况。

对于第二个错误,我认为它是由表达式Num / F引起的。这将生成一个浮点数,而problem_3需要整数参数。尝试

1
problem_3(Num div F, F);

相反。


为加快解决速度而提出的一些建议。

start()->
problem_3(600851475143, 3).

不需要检查2号。

变化

1
problem_3(Num, F + 1)

problem_3(Num, F + 2)

没有理由检查偶数。