改完的如下:
clear all
disp("10000以內全體素數:")
count=0;
for i=2:10000
j=2; % 每次外迴圈,j都要從頭再來,所以要拿到外迴圈裡。
k=sqrt(i);
while j
if rem(i,j)==0
break
else
j=j+1;
end
if j>k
fprintf("%5d",i) % 給你改成%5d了,要不都挨一塊分不出個兒來了。
count=count+1;
if rem(count,13)==0 % 這個if塊,要放到判斷j>k裡,要不會多出好多空行
fprintf("\n")
break % 這個最重要,j>k時一定要退出內迴圈,要不然j會繼續執行到等於i才會退出的
不過話說回來,matlab本身就帶求n以內素數的函式啊,用primes
比如
>> primes(100)
ans =
Columns 1 through 17
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59
Columns 18 through 25
61 67 71 73 79 83 89 97
如果不可以用primes的話,自己編也不用那麼複雜啊
給你重新編了個簡單的,不太好理解,不過程式簡單。
n=10000;
p = 1:2:n; % 找出奇數,因為除了2的所有素數都是奇數
q = length(p);
p(1) = 2; % 第一個素數為2
for k=3:2:sqrt(n)
if p((k+1)/2) % 如果p((k+1)/2)也就是p中原本應該等於k的那個數不為0的話
p((k+1)/2+k:k:q)=0;
% 這句的作用就是把p中所有能被k整除的數設為0,但不包括k本身。
% (k+1)/2是奇數k在p中的位置,(k+1)/2+k代表p中除了k本身之外的第二個能被k整除的數的位置,依此類推
p=p(p>0); % 把等於0的,也就是原來位置上的數是合數的去掉
fprintf("%d以內的素數有:\n",n);
q=length(p);
for k=1:13:q
fprintf("%5d",p(k:min(q,k+12))); % 每行輸出13個數
fprintf("\n");
改完的如下:
clear all
disp("10000以內全體素數:")
count=0;
for i=2:10000
j=2; % 每次外迴圈,j都要從頭再來,所以要拿到外迴圈裡。
k=sqrt(i);
while j
if rem(i,j)==0
break
else
j=j+1;
end
if j>k
fprintf("%5d",i) % 給你改成%5d了,要不都挨一塊分不出個兒來了。
count=count+1;
if rem(count,13)==0 % 這個if塊,要放到判斷j>k裡,要不會多出好多空行
fprintf("\n")
end
break % 這個最重要,j>k時一定要退出內迴圈,要不然j會繼續執行到等於i才會退出的
end
end
end
不過話說回來,matlab本身就帶求n以內素數的函式啊,用primes
比如
>> primes(100)
ans =
Columns 1 through 17
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59
Columns 18 through 25
61 67 71 73 79 83 89 97
如果不可以用primes的話,自己編也不用那麼複雜啊
給你重新編了個簡單的,不太好理解,不過程式簡單。
n=10000;
p = 1:2:n; % 找出奇數,因為除了2的所有素數都是奇數
q = length(p);
p(1) = 2; % 第一個素數為2
for k=3:2:sqrt(n)
if p((k+1)/2) % 如果p((k+1)/2)也就是p中原本應該等於k的那個數不為0的話
p((k+1)/2+k:k:q)=0;
% 這句的作用就是把p中所有能被k整除的數設為0,但不包括k本身。
% (k+1)/2是奇數k在p中的位置,(k+1)/2+k代表p中除了k本身之外的第二個能被k整除的數的位置,依此類推
end
end
p=p(p>0); % 把等於0的,也就是原來位置上的數是合數的去掉
fprintf("%d以內的素數有:\n",n);
q=length(p);
for k=1:13:q
fprintf("%5d",p(k:min(q,k+12))); % 每行輸出13個數
fprintf("\n");
end