我是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中的数字是否为质数?非常感谢。
下面的代码将测试数字是否为质数。只需调用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.
尝试一下,我希望它能正常工作,只需调用函数prime
,它将返回true
的false
:
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].
尝试一下:
prime([X|_]) when X =< 1 -> error(not_a_prime);
prime([X|Ns]) -> [N || N <- Ns, N rem X /= 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) :=
创建两个数字之间的列表
这可能不是设置功能的最有效方法,但是它起作用:
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)].