重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
篩選法的規律:(以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