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

问题描述 投票:0回答:5

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

我正在尝试编写一个带有两个参数并返回它们之间的质数的函数。我最大的问题是素数测试(检查数字是否为素数)。我稍后会修复其余的内容。

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

-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中的数字是否为质数?非常感谢。

list erlang primes
5个回答
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.

0
投票

尝试一下,我希望它能正常工作,只需调用函数prime,它将返回truefalse

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

0
投票

尝试一下:

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

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) :=创建两个数字之间的列表


0
投票

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

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)].
© www.soinside.com 2019 - 2024. All rights reserved.