定义提示的数字是否为素数

时间:2014-04-07 09:44:03

标签: matlab

我想要一个代码来定义用户提示的数字是否为素数。因为它是一项任务 我不允许使用' isprime'预定义代码。 以下方法没用:

N = input( 'please enter a positive enteger value = ' ) ; 
Quotient = floor(N - (mod(N,2)./2)) ; 
for i = 1 : Quotient  
    if mod(N,i ) == 0 
        fprintf(' your prompted number is not prime ' ) ;
        if mod(N,i) ~= 0 
            fprintf(' your prompted number is   prime ' ) ; 
        end
    end
end

例如,如果我输入像13这样的素数,则会产生以下结果:

 your prompted number is  prime

但是如果我输入像12这样的非素数,它会重复'你的提示号码是最重要的'消息10次。

2 个答案:

答案 0 :(得分:0)

尝试找到因素,一旦找到一个因素,你就知道它不是素数:

prime = true

for f = 2:ceil(sqrt(N)) %// Start from 2 as prime numbers DO have 1 as a factor. Anything larger than sqrt(N) will have to have a corresponding factor smaller than this so there is no point checking them
    if mod(N,f) == 0
       prime = false;
       break;
    end
end

您的代码有2个问题。首先,正如paxdiablo已经解释的那样,你需要从2开始循环。其次,你已经嵌套了if语句,并且因为它们是相互排斥的条件,所以内部条件永远不会触发。

答案 1 :(得分:0)

for i = 1 : Quotient  
    if mod(N,i ) == 0 

这将为您提供每个号码,因为x mod 1始终为零。换句话说,余数(当你将任何正整数除以1时)为零,因为它们都完全分开。

你需要从2而不是1开始。

此外,一旦你发现数字不是素数,你应该停止循环,因为之后不可能再次成为素数:-)而且,为了提高效率,你只需要去数字的平方根,如果它有一个高于该数的因子,你就已经找到了低于该值的等价因子。

这种野兽的伪代码是:

set isprime to true
set chkval to 2
while chkval * chkval <= number:
    if number mod chkval is zero:
        set isprime to false
        exit while
    end if
    increment chkval
end while
if isprime:
    say number, " is prime"
else:
    say number, " is composite"