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

Posted

技术标签:

【中文标题】Erlang:打印第一个参数和第二个参数之间的素数列表【英文标题】:Erlang: Print a List of Prime Numbers between first parameter and second 【发布时间】:2015-12-13 19:31:54 【问题描述】:

我是 Erlang 的新手,只是有一个问题。 我已经在 *** 上查看过这里并进行了很多谷歌搜索。

我正在尝试编写一个函数,它接受两个参数并返回它们之间的质数。我最大的问题是素数测试(检查一个数字是否是素数)。其余的东西我稍后再修。

这是我目前的代码:

-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 是否为质数。

如果没有,请转到下一个数字 (Finish-1)。

继续直到达到基本情况。

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

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

Finish rem Finish

并且代码行适用于任何使用的数字。如何在 Erlang 中检查一个数字是否为素数?非常感谢。

【问题讨论】:

在 SICP 中有一个关于这个的讨论,很容易翻译成 Erlang。 mitpress.mit.edu/sicp/full-text/book/… 素性测试是一个活跃的研究领域。 看here。 【参考方案1】:

下面的代码将测试一个数字是否是素数。只需调用函数 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.

【讨论】:

这似乎只是为了检查被 2 整除,并且知道几个数字的测试值。带有两个不同相等运算符的 if 语句对我来说没有多大意义。【参考方案2】:

试试这个,我希望它能正常工作,只需调用函数prime,它就会返回falsetrue

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

【讨论】:

这可能有效。很简单,二人的从句似乎是不需要的。有更快的算法。【参考方案3】:

试试这个:

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

【讨论】:

这似乎只是从 Ns 中提取不能被 X 整除的元素。【参考方案4】:

你需要一个调用函数! 就这样做吧:

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

【讨论】:

【参考方案5】:

这可能不是设置函数的最有效方式,但它确实有效:

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

【讨论】:

以上是关于Erlang:打印第一个参数和第二个参数之间的素数列表的主要内容,如果未能解决你的问题,请参考以下文章

素数和

素数和

linux下exec 函数第一个参数和第二个参数的区别

第四周:循环控制

中国大学MOOC-C程序设计(浙大翁恺)—— 素数和

Erlang, register/2: 异常错误错误参数