2016-08-18 69 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