在 MATLAB 中查找素数的程序

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

我按照维基百科上的伪代码编写了一些代码来显示 2 和用户选择的数字之间的素数。我不确定为什么这不起作用,因为我按照埃拉斯托尼筛法得到了正确的增量。请帮助我。

我尝试过更改边界,但这不起作用。

没有错误,但返回错误的输出。如果我输入 10,它会返回 2, 3, 4, 5, 6, 7, 8, 9, 10。

n=input("Enter an upper limit: ");
nums= 2:n;
p=2;
for i = p:sqrt(n)
    for j = (i^2):i:sqrt(n)
        nums(j) = 0;
    end
end
for k = 1:n-1
    if nums(k) ~= 0
        disp(nums(k))
    end
end
matlab for-loop primes
3个回答
5
投票

您可以使用 MATLAB 中的

primes
函数来实现此目的

N = 10;        % upper limit
p = primes(N); % List of all primes up to (and including) N

通过少一步自动化,您可以使用另一个内置的

isprime

p = 1:N;                  % List of all numbers up to N
p( ~isprime( p ) ) = [];  % Remove non-primes

终于不用使用内置函数,我们就可以解决您的代码了! 我假设您指的是维基百科上的埃拉托斯特尼筛法的这个伪代码

 Input: an integer n > 1.

 Let A be an array of Boolean values, indexed by integers 2 to n,
 initially all set to true.

 for i = 2, 3, 4, ..., not exceeding √n:
   if A[i] is true:
     for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n:
       A[j] := false.

 Output: all i such that A[i] is true.

我将逐步遵循它,指出与您的代码的差异:

n = 10;
A = [false; true(n-1,1)];   % array of true Booleans, first element (1) is not prime
% But I've included a first element to make indexing easier.
% In your code, you were using index 'i' which was incorrect, as your array started at 2.
% Two options: (1) take my approach and pad the array
%              (2) take your approach and using indices i-1 and j-1
for ii = 2:sqrt(n)
    if A(ii) == true        % YOU WERE MISSING THIS STEP!
        for jj = ii^2:ii:n   % YOU ONLY LOOPED UNTIL SQRT(n)!
            A(jj) = false;
        end
    end
end

p = find(A);
disp(p)

这会输出预期值。

请注意,在手动循环方法结束时,

A
相当于
isprime(1:n)
,反映了我之前的建议。


2
投票

您的代码中有两个错误:

  1. 倍数应检查到

    n
    ,而不是
    sqrt(n)

  2. 因为你的

    nums
    向量以 2 而不是 1 开头,如果你想 访问您需要使用的正确值
    nums(j-1) = 0

所以:

n=100
nums= 2:n;
p=2;
for i = p:sqrt(n)
    for j = (i^2):i:n
        nums(j-1) = 0;
    end
end
for k = 1:n-1
    if nums(k) ~= 0
        disp(nums(k))
    end
end

注意到您可以使用模数跳过一个 for 循环,它可能不会比之前的解决方案更快,因为此代码创建了一个包含已找到的每个素数的逻辑索引。

n   = 100
nums= 2:n;

for i = 2:sqrt(n) 
    nums(mod(nums,i)==0 & nums != i) = [];
end

nums.'

我只是删除

nums
中可以除以
x
但不能除以
x
的值。


0
投票

n=input('Enter a number:')
F=factor(n);
if F==n
    disp('Prime number.')
else
    disp('Not a prime number.')
end

© www.soinside.com 2019 - 2024. All rights reserved.