Проект Эйлера № 3 в Эрланге - PullRequest
2 голосов
/ 20 июня 2011

Я пытаюсь кодировать Project Euler # 3 на Erlang:

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

Вот мой код:

-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]).

Но у меня есть 2 проблемы с этим кодом:

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

Почему у меня есть эти ошибки и как я могу это исправить?

Ответы [ 2 ]

6 голосов
/ 20 июня 2011

Первая ошибка довольно очевидна: если остаток больше 1, ни одно предложение не будет соответствовать.Попробуйте изменить второе предложение на

_Else ->
         problem_3(Num, F+1)

, что соответствует всем случаям, когда остаток не равен нулю.

Для второй ошибки, я думаю, это результат выражения Num / F.Это дает число с плавающей запятой, тогда как problem_3 ожидает целочисленные аргументы.Попробуйте вместо

problem_3(Num div F, F);

.

0 голосов
/ 06 февраля 2018

Несколько поздних указателей для ускорения решения.

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

Нет необходимости проверять номер 2.

Изменить

problem_3(Num, F + 1)

К

problem_3(Num, F + 2)

Нет причин проверять четные числа.

...