2016-08-18 68 views
0

好吧,我一直在创建一个素数检查器。我已经成功地使它适用于特定的号码。代码在这里。Matlab Prime number list checker

#To test if number is prime 

prompt = input("number to test if prime: "); 
n = prompt; 
i = 2; #start of mod test 
t = floor(sqrt(n)); 
counter = 0; 
tic 
for i = 2:t 
    if mod(n,i) == 0 
    disp('n is not prime') 
    break 
    else 
    counter = (counter + 1); 
    end 
end 

if counter == t-1 
    disp('n is prime') 
end 
toc 

然后我试着做一个程序来测试一系列的数字。它在n = 10的时候取得了成功,但是当我高于这个数字时,它似乎没有提高质数。我不确定我要去哪里错。

#Want to test numbers 2:n if they're prime 

prompt = input("max number to test: "); 
n = prompt; 
l = 2; #start of mod test 
counter = 0; 
tic 

for i = 2:n #cycle to test 2 up to n 
    t = floor(sqrt(i)) #Only need to test up to root of number 
    for l = 2:t 
    if mod(i,l) == 0 
     break 
    else 
     counter = (counter + 1); 
     end 
    end 
    if counter == t-1 # if tested up to the root of the number, it must be prime 
    prime = sprintf('%d is prime', round(i)); 
    disp(prime) 
    counter = 0; 
    end 
end 
toc 

在得到它的较大值工作任何帮助将不胜感激,也什么方法可以使代码更高效。顶级程序可以在0.268秒内在我的笔记本电脑上测试982451653。

+0

这是1)的乐趣吗? 2)上课吗? 3)或者你实际上需要一个质数检查器? – Suever

+0

只是为了好玩:)在大学开始之前试图让matlab变得更好! –

+0

提高效率的提示:如果一个数字不能被2除,那么它将不会是4,6,8 ......因此您可以减少大量的检查。同样,对于3,6,9等... –

回答

0

只是一种线性化你的算法:

n = 997 %test number 
t1 = n./([2,3:2:n/2]); 
t2 = t1 - round(t1); 
res = sum(t2 == 0); %can n be divided ? 

if res == 0 
    fprintf('%s','prime'); 
else 
    fprintf('%s','not prime'); 
end 
+0

嗨obchardon,感谢您的代码。首先,矩阵是如何工作的? (当我把它写入matlab时它看起来非常有趣),我把它放到了我之前的东西中。它发现了很多素数。但我也有一些误报,如4,8,16,64。上面的代码是不是4?这是我用[code] prompt = input(“max number to test:”); n =提示;对于i = 2: t1 = i./(3:2:i/2); t2 = t1 - round(t1); res = find(t2 == 0,1); %能不能被分割?如果size(res,2)== 0 prime = sprintf('%d是素数',round(i)); 显示(首要) 结束 结束[/ code] –

+0

@JamesBlackwell ho我的不好,我没有检查测试号码是否是偶数,现在它是固定的:)它与您的算法类似,我只是检查如果测试号码除以[2,3,5,7,9,11 ... n/2]。使用'。/'运算符,你可以在Matlab中用一个数组来分割单个数字,然后代码检查它是否存在一个没有休息的分区。 – obchardon

+0

非常感谢您的帮助!我会upvote,但仍需要首先增加我的代表。它是一个非常干净的方式来检查它:) –

0

我在这个问题上的帮助,发现“反”被不断地重新设置,需要进行向上移动。固定代码在这里

#Want to test numbers 2:n if they're prime 

prompt = input("max number to test: "); 
n = prompt; 
l = 2; #start of mod test 
counter = 0; 
tic 

for i = 2:n #cycle to test 2 up to n 
    t = floor(sqrt(i)); #Only need to test up to root of number 
    counter = 0; 
    for l = 2:t 
    if mod(i,l) == 0 
     break 
    else 
     counter = (counter + 1); 
     end 
    end 
    if counter == t-1; # if tested up to the root of the number, it must be prime 
    prime = sprintf('%d is prime', round(i)); 
    disp(prime) 

    end 
end 
toc