篩選法的規(guī)律:(以1~1000內(nèi)的素數(shù)少選為例)
耀州網(wǎng)站建設公司成都創(chuàng)新互聯(lián),耀州網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為耀州成百上千提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的耀州做網(wǎng)站的公司定做!
我們知道素數(shù)的定義:只能被1和他本身整除的是素數(shù),那這樣看的話,只要有一個既不是1又不是這個數(shù)本身的數(shù)把這個數(shù)整除了,就可以說明這個數(shù)不是素數(shù)了。例如 5是素數(shù),因為5只能被5和1整除,6不是素數(shù),,因為6除了能被1和6整除,還能被2和3整除。試想一下,我們要判斷6是不是素數(shù),需不需要循環(huán)到6的時候才進行判斷呢,不需要,因為2和3都是他的因子,我們在循環(huán)到2的時候,找到2的所有倍數(shù),如4,6,8,10,12等等,這些數(shù)都至少有2這個因子,因此可以判定它們都不是素數(shù)了。而由于4是2的倍數(shù),在循環(huán)到2的時候已經(jīng)判定4不是素數(shù)了,所以我們不需要在挖掉4的倍數(shù)了,直接跳過4,來到5,挖掉5的所有倍數(shù),然后是6,6在值錢是2的倍數(shù)被挖掉了,所以跳過6,來到7.....一直循環(huán)到最后一個數(shù)字為止,這個時候就是上面7步中說的,剩下沒有被挖掉的(挖掉的含義就是把這個數(shù)置0)也就是非0的數(shù)字就是素數(shù)了。
不知道我說的你能不能聽懂。希望對你有幫助吧。
我發(fā)現(xiàn)你不是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;
}
//規(guī)模較大時,篩選法確實比較快
#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;//第一個素數(shù)
P[1]=3;
M=2;//數(shù)組中素數(shù)個數(shù)
sqrtN = (int)sqrt(MAX_N);
for (N=3;NsqrtN;N+=2)//偶數(shù)不可能時素數(shù),跳過
{
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函數(shù)的n=n/2;這個語句上了,本來要計算的是200。結(jié)果你在這里把n折半,結(jié)果就再后面m=sqrt(n);m的取值就不是根號下200而是100結(jié)果10以上的素數(shù)就沒有做為因子用上,所以直接導致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("輸入整數(shù)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 功能: 把字符串轉(zhuǎn)換成整型數(shù)
最后一個字母i代表他的類型integer
s string
f float