Erlang:在第一个参数和第二个参数之间打印一个素数列表

时间:2015-09-17 02:30:56

标签: list erlang primes

我是Erlang的新手,只是有一个问题。 我已经在StackOverflow上看了一下并完成了很多Google搜索。

我试图编写一个带有两个参数并返回它们之间的素数的函数。我最大的问题是Prime测试(检查数字是否为素数)。我稍后会解决剩下的问题。

这是我到目前为止的代码:

-module(ListPrime). -export([primeList/2]).

primeList(0, 0)-> io:format("No prime numbers here ~s~n", [0]); `

primeList(Start, Finish)-> CheckPrime = Finish rem Start, if Start =< Finish, CheckPrime == 1 -> primeList(Start, Finish-1) end.

基本上我要做的是:

  • 检查Finish是否为素数。

  • 如果没有,请转到下一个号码(完成-1)。

  • 继续,直到达到基本案例。

它编译但显然没有做我想做的事情,因为我不知道如何检查数字是否为素数

我知道素数的定义是什么(一个只能被它自身整除的数字和1)但是当我想到这个定义时,我想到的唯一想法就是:

Finish rem Finish

和代码行适用于任何使用的数字。如何检查Erlang中的数字是否为素数?非常感谢你。

5 个答案:

答案 0 :(得分:0)

下面的代码将测试一个数字是否为素数。只需调用函数isPrime,它将返回true或false。

-module(isPrime).
-export([isPrime/1]).

 isPrime(0)-> false;
 isPrime(1)-> false;
 isPrime(2)-> true;


isPrime(N)->
  ChPrime = N rem 2,
  if
    ChPrime == 1 -> false;
    ChPrime =:= 1 -> true
end.

答案 1 :(得分:0)

试试这个,我希望它工作正常,只需调用函数true,它将返回false的{​​{1}}:

divisors(N) ->
    [ X || X <- lists:seq(1,N), (N rem X)==0].
prime(N) when N == 0; N == 1 ->
    false;
prime(2) ->
    true;
prime(N) ->
    divisors(N) == [1,N].

答案 2 :(得分:0)

试试这个:

prime([X|_]) when X =< 1 -> error(not_a_prime);
prime([X|Ns]) -> [N || N <- Ns, N rem X /= 0].

答案 3 :(得分:0)

您需要来电功能! 就这样做:

%% caller function
run(X, Y) ->
    prime(lists:seq(X, Y)).

%% prime function
prime([X|_]) when X =< 1 -> error(not_a_prime);
prime([X|Ns]) -> [N || N <- Ns, N rem X /= 0].

lists:seq(X, Y) :=在两个数字之间创建一个列表

答案 4 :(得分:-1)

这可能不是设置功能的最有效方法,但是它起作用:

prime(2)->true;
prime(N)when N rem 2 =:= 0-> false;
prime(3)->true;
prime(Odd)->prime(Odd,3).

prime(N,I)when N rem I =:= 0->false;
prime(N,I)when I*I > N->true;
prime(N,I)->prime(N,I+2).

primes(Start,Finish)->[X|| X <- lists:seq(Start,Finish), prime(X)].