我想要一个代码来定义用户提示的数字是否为素数。因为它是一项任务 我不允许使用' 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次。
答案 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"