扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
筛选法的规律:(以1~1000内的素数少选为例)
耀州网站建设公司成都创新互联,耀州网站设计制作,有大型网站制作公司丰富经验。已为耀州成百上千提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的耀州做网站的公司定做!
我们知道素数的定义:只能被1和他本身整除的是素数,那这样看的话,只要有一个既不是1又不是这个数本身的数把这个数整除了,就可以说明这个数不是素数了。例如 5是素数,因为5只能被5和1整除,6不是素数,,因为6除了能被1和6整除,还能被2和3整除。试想一下,我们要判断6是不是素数,需不需要循环到6的时候才进行判断呢,不需要,因为2和3都是他的因子,我们在循环到2的时候,找到2的所有倍数,如4,6,8,10,12等等,这些数都至少有2这个因子,因此可以判定它们都不是素数了。而由于4是2的倍数,在循环到2的时候已经判定4不是素数了,所以我们不需要在挖掉4的倍数了,直接跳过4,来到5,挖掉5的所有倍数,然后是6,6在值钱是2的倍数被挖掉了,所以跳过6,来到7.....一直循环到最后一个数字为止,这个时候就是上面7步中说的,剩下没有被挖掉的(挖掉的含义就是把这个数置0)也就是非0的数字就是素数了。
不知道我说的你能不能听懂。希望对你有帮助吧。
我发现你不是a[3][3]的矩阵,你应该是一维的矩阵吧。
如果你入门了,也许这个代码更适合你。如果不懂,追问!
#includestdio.h
#includestdlib.h
#define n 5
char* atos(int*a,int len,char*s)
{
int i;
for(i=0;ilen;i++)
s[i]='0'+a[i];
s[i]=0;
return s;
}
int main()
{
int i;
int a[]={1,2,3,4,5},b[n-1];
char s1[n+1],s2[n+1];
for(i=0;in-1;i++)
{
b[i]=atoi(atos(a,i+1,s1))+atoi(atos(a+i+1,n-i-1,s2));
printf("%d ",b[i]);
}
return 0;
}
//规模较大时,筛选法确实比较快
#includeiostream
#includecmath
using namespace std;
#define MAX_NUM 1000000
#define MAX_N 10000000
int main()
{
int *P;
bool *B;
int M, N, i, j, t, sqrtN;
bool flag;
P = (int *)malloc(sizeof(int)* MAX_NUM);
B = (bool*)malloc(sizeof(int)* MAX_N);
for (i=0;iMAX_N;i++)B[i]=true;
B[0] = B[1] = false;
P[0]=2;//第一个素数
P[1]=3;
M=2;//数组中素数个数
sqrtN = (int)sqrt(MAX_N);
for (N=3;NsqrtN;N+=2)//偶数不可能时素数,跳过
{
i=1;
flag = true;
t=(int)sqrt(N) ;
while (P[i]=t)
{
if (N%P[i]==0)
{
flag = false;
break;
}
i++;
}
if (flag)
{
P[M++]=N;
if (MMAX_NUM)
{
cout"too large"endl;
exit(0);
}
}
}
for (i=0;iM;i++)
{
for (j=2;j=MAX_N/P[i];j++)
{
B[j*P[i]]=false;
}
}
t=0;j=0;
for (i=0;iMAX_N;i++)
{
if (B[i]==true)
{
P[j++]=i;
t++;
}
}
return 0;
}
主要问题出在erat_sieve函数的n=n/2;这个语句上了,本来要计算的是200。结果你在这里把n折半,结果就再后面m=sqrt(n);m的取值就不是根号下200而是100结果10以上的素数就没有做为因子用上,所以直接导致121和169没有被清除出来。
你这个方法不是筛法吧,筛法是不用除法了求模运算的。我写个筛法你看看
#include "stdio.h"
#include "math.h"
int main()
{
char prime[10000]={0};
int i,j,n,m;
for(i=3;i10000;i+=2) prime[i]=1;
prime[2]=1;
printf("输入整数n(1~n):");
scanf("%d",n);
m=sqrt(n);
for(i=3;im;i++)
{
for(j=i*2;jn;j+=i)
{
if(prime[j]) prime[j]=0;
}
}
j=0;
for(i=0;in;i++)
{
if(prime[i])
{
printf("%3d ",i);
j++;
if(j%10==0) printf("\n");
}
}
printf("\n%3d ",j);
}
atoi 功能: 把字符串转换成整型数
最后一个字母i代表他的类型integer
s string
f float
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流