问题描述:
使用素性判断的方法找出1-50之间的素数。在在本任务中,不仅需要您自己编程实现素数判断,而且不能使用从1遍历到根号下n的方法判断。
说白了就是不让用试除法
求素数有一篇很有名的文章,叫“素数求解的N种境界”,请自行在CSDN搜索。这篇文章除了讲解试除法外,还讲解了筛法,本人就是受筛法思想的启发,写了这篇博客。
求解思想大致如下:
创建一个布尔型数组并全部初始化为true,下标是素数的,里面的值仍是true,下标是合数的,里面的值改为false,最后输出值为true的下标。
matlab创建的一维矩阵下标从1开始,这点好评。1不是素数,下标为1的值改为0,也就是为false。2是素数,里面的值不变,然后下标为2的倍数的里面的值改为false。然后依次向下遍历。
代码如下:
P=true(1,50);%创建一个布尔型数组
P(1)=0;%1不是素数
for i=linspace(2,50,49)%创建循环变量
e=50/i;%求素数的倍数,比如下标为2的倍数的值全改为false,需要知道有多少个2的倍数
for j=2:e
if(i*j<=50 && P(i*j)==1)%i*j<50,保证不越界,P(i*j)==1),防止重复,比如6即时2的倍数,又是3的倍数,在找2的倍数的循环中,把下标为6的值改为0;到找下标3的倍数的循环中,就不需要考虑下标为6了。
P(i*j)=0;
end
end
end
for i=2:50%输出素数,没什么好说的
if(P(i)==1)
fprintf("%d\n",i)
end
end
总结:
我写的这个算法仍然很挫,只是避免使用试除法,真正的筛法还分线性筛和欧拉筛等等。不过,我水平实在有限,等后期matlab玩的溜了再继续优化。
也欢迎和我分享你的算法。