Matlab求20以内的素数,不准用primes,这个程序错在哪儿?

作者&投稿:卢郭 (若有异议请与网页底部的电邮联系)
看看这个matlab求素数的程序哪错了~

n=3;
p=2;
while n<=100
for m=2:fix(sqrt(n));
if mod(n.m)==0 %这是,吧
n=n+2;
else
p=p+n;%这儿为什么要+n?
n=n+2;%n加在这儿的话就相当于在if语句这内加。。。不在while循环内,在for循环内,for m=2:fix(sqrt(n));不就死循环了啊
end
end
end


改了下
n=3;
p=2;
while n<=100
for m=2:fix(sqrt(n));
if mod(n,m)==0
m=m-1;
break;
end
end
if m==fix(sqrt(n))
p=n
end
n=n+1;
end

第一种方法:
matlab本身就带求n以内素数的函数,叫primes()
所以最简单的就是直接用primes(1000)
篇幅关系我用100举例,比如
>> 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


第二种方法:
另外matlab自带的还有一个判断某数是否为素数的函数,叫isprime()
用这个编程的话,

p = 2; % 2是第一个素数
for i = 3:2:10000 % 其他素数一定是奇数,所以从3开始的奇数来判断
if isprime(i)
p = [p i]; % 如果i是素数,在p后面增加一个i值。
end
end
p


第三种方法:
如果用系统自带的函数的话
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);
q=length(p);
for k=1:13:q
fprintf('%5d',p(k:min(q,k+12))); % 每行输出13个数
fprintf('
');
end

我觉得这是个作业吧,我就不直接给你答案了。
我给你解释一下你这个程序为什么出错。
首先对于P的赋值问题,一开始只要给出一个2就可以了。素数的定义是约数只有1和本身,1既不是素数也不是合数。所以从2开始验证。
P的赋值可以直接做成P = [2]。作为一开始的赋值。
然后出现了一个问题,你的循环里面,如果这个数是3,那么余数是1,这个数就会被加到P表里面,跳出循环。之后是4,因为可以被P[1],也就是2 整除,这个地方进入条件1,跳出循环。之后是5,不能被2整除,跳出循环,然后6,7,8,同理,7会进入列表,因为不能为2整除。但是之后的9出现了问题,因为9不能被2整除,所以会进入下一个条件,添加到P表里面,但是这时候跳出循环了。这个时候,就不会检测P表第二个数值, 3。
明白这个地方的问题出在哪儿了吧?
你给的条件根本不会用到j-indexed的循环,这个就是问题。问题出在你嵌套的那个条件判定。
这个地方的改法有很多,我给一个提示,质因数。
你看看自己研究一下怎么改,我觉得直接告诉你一个答案就把你的思维卡死了。

分析

程序主要存在两个问题

1、有一个地方写错了:

for i=:n,

应为

for i=4:n,

 

2、这个条件判断的else分支不合理

if rem(i,P(j))==0

因为只是判断了能否被P(j)整除,不能整除就会被加入P中,这显然不合理。正确的做法是,判断能否被P中任何一个元素整除,如果可以,就是合数;如果都不能整除,才是素数。

 

3、不算错误:变量ss没任何作用,可以去掉。

 

改写后的程序

n=20;P=[2,3];
for i=4:n, 
    if all(rem(i,P)),
        P=[P,i];
    end
end
P

输出

P =
     2     3     5     7    11    13    17    19


n=20;P=[2,3];ss=0;
for i=4:n%就这句是不小心打错了吧
for j=1:size(P,2),
if rem(i,P(j))==0,
break
else
P=[P,i];
break
end
end
end

P


施工中的椭圆怎么放样.请详细说明简易的放样方式,以及计算公式_百度...
参数 t (亦称之为椭圆离心角 ) 和旋转角θ的关系如图 4所示 ,θ = arctan ( b tan t \/ a) , 以θ β = arctank 法 = arctan a tan t b 为参数的椭圆方程为 :这样椭圆旋转楼梯的中心线、内外边上各等分点 Ai 、B i 、Ci 的坐标均已求出 , 即可进行施工放样。同时根据各点在...

新人求助matlab安装包做毕设要用
1、下载解压缩,得到iso格式的matlab 2014b文件;2、安装DVDFab Virtual Drive虚拟光驱,并将iso文件装载到虚拟光驱中;3、打开“setup.exe”文件开始安装,选择“不使用internet安装”;4、选择“是”接受许可协议;5、安装密钥随意20个数字,11111111111111111111,就可以;6、安装路径,小编更改为D:\\Progr...

什么情况下用灰色系统理论来预测?
灰色系统预测在处理数据变化趋势比较单一的数据精度较高,例如随时间大致呈现递增或递减的数据,建立模型之后要检验精度的,精度合格就行。

九洲配音的发展历史
53、2013年2月 九洲配音首度开通注册公司官方微信!九洲配音J52、2013年2月 华北九洲配音新站正式上线运营!51、2013年2月 浏阳敬老院表彰九洲配音公益之举!50、2013年1月 九洲配音管理制度由管理委员会正式提升至资深客服管理制!2012年49、2012年12月30 九洲配音成功举办一年一度公司迎新年会!48、2012...

大洼县17020958439: Matlab求20以内的素数,不准用primes,这个程序错在哪儿? -
励军久强: 分析 程序主要存在两个问题1、有一个地方写错了:for i=:n,应为 for i=4:n, 2、这个条件判断的else分支不合理 if rem(i,P(j))==0因为只是判断了能否被P(j)整除,不能整除就会被加入P中,这显然不合理.正确的做法是,判断能否被P中任何一个元素整除,如果可以,就是合数;如果都不能整除,才是素数. 3、不算错误:变量ss没任何作用,可以去掉. 改写后的程序 n=20;P=[2,3]; for i=4:n,if all(rem(i,P)), P=[P,i]; end end P输出 P = 2 3 5 7 11 13 17 19

大洼县17020958439: 我用matlab编了一个取数组中素数的函数,可是老是有错,求大神指导 -
励军久强: isprime(Q)返回的是一个逻辑数组 数组Q中相应位置为素数的位置为1,其他位置为0.你是刚学matlab吧,语法都有问题.function Z=sushu(Q) Z=Q(isprime(Q)); end 这么写就求出你要的数组中的全部素数了.

大洼县17020958439: 用matlab编写一个程序:求出200以内的质数,求!!!!急!!!!! -
励军久强: % 主函数 function test() x = []; for i=1:200 flag = isprime(i); if flag x = [x,i]; end end disp('1-200之间的质数有:'); x end % 子函数 function out = isprime(n) flag = 1; for i=2:ceil(sqrt(n)) if mod(n,i)==0 flag = 0; break; end end out = flag; end

大洼县17020958439: matlab 编程 编制函数M文件求出某自然数范围内的全部素数,即给定参量n之后,能求出1到n之间的全部素数 -
励军久强: 在Matlab下输入:edit,然后将下面两行百分号之间的内容,复制进去,保存 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function x=myprime(n) a=2:n; x=a(isprime(a)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%在Matlab下面输入: myprime(20)

大洼县17020958439: [求助]:matlab 用while循环求100 - 200间的素数... -
励军久强: i=1; x=[]; for j=100:200 if isprime(j) %或者这里自己写判断是否是素数的函数 x(i)=j; end i=i+1; end

大洼县17020958439: matlab 判断素数程序求纠错 -
励军久强: function a = issushu() a = 1; x=input('输入的数') for i=1:(x-1) if mod(x,i) == 0 % 如果被整除了,就不是素数 a=0; break; % 只要被一个数整除了就确定不是素数,也就没必要再往下循环验证了 end end

大洼县17020958439: matlab求10000以内的素数 -
励军久强: 改完的如下:clear all disp('10000以内全体素数:') count=0; for i=2:10000j=2; % 每次外循环,j都要从头再来,所以要拿到外循环里.k=sqrt(i);while jif rem(i,j)==0breakelsej=j+1;end if j>kfprintf('%5d',i) % 给你改成%5d了,要不都挨...

大洼县17020958439: 看看这个matlab求素数的程序哪错了
励军久强: n=3; p=2; while n&lt;=100 for m=2:fix(sqrt(n)); if mod(n.m)==0 %这是,吧 n=n+2; else p=p+n;%这儿为什么要+n? n=n+2;%n加在这儿的话就相当于在if语句这内加...不在while循环内,在for循环内,for m=2:fix(sqrt(n));不就死循环了啊 end end end 改了下 n=3; p=2; while n&lt;=100 for m=2:fix(sqrt(n)); if mod(n,m)==0 m=m-1; break; end end if m==fix(sqrt(n)) p=n end n=n+1; end

大洼县17020958439: 求助matlab 用while循环求100 - 200间的素数 -
励军久强: num=200; i=100; flag=0; m=0; A=[]; while i<=numj=2;while j<=i-1if rem(i,j)==0flag=flag+1;endj=j+1;endif flag==0m=m+1;A(m)=i end i=i+1; end A 这个程序有点问题我也没有调试.你自己调试一下就行了.其实用for容易理解的多.

大洼县17020958439: matlab的一道求素数的题目 -
励军久强: matlab里面的循环变量和c不一样 在matlab里for i=2:k, 结束循环以后,i的最终值是不大于k的整数 而c,c++,里面for (i=2; i所以你的函数里 if(i>k)总是false 可以考虑用一个flag function a=sushu(m) k=sqrt(m); flag=0; for i=2:k if rem(m,i)==0 flag=1; break; end end if(flag=0) a=1; else a=0; end

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网