改完的如下:
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
x=1:1000;
x(isprime(x))