C語言最優化求素數


   初學C語言,看到求素數的代碼,不是太滿意,自己設計了一個計算流程圖.在貼吧里也問了一下,和"埃拉托色尼(Eratosthenes)篩法”有些撞車,當然在下不敢與數學巨匠們爭長短,不過還是想自己試一下.

   百度了一下有人已經用這類方法做了代碼,不過和我的想法有出入。

思路:

1要避免冗余的求余計算的計算次數,這樣在數字足夠大的時候更能體現更高的計算效率,

  1)分母排除偶數,可以減少一半的計算量.具體做法是改+1遞增為從第二個素數3開始+2遞增;

  2)篩選求余計算的分子,而根據素數的定義,只要不被小於分母的素數整除即可,​設置最大求余分子計算至分母平方根+1;如此可以避免對每個數進行求余,可以減少大量的冗余計算量.

  3)快速淘汰合數,從最小素數開始計算,能更快更有效率

2 找出一個素數,然后賦值,可以避免存儲無用的數值,利用找出的素數作為分子進行計算,可以進一步提高效率.

經過2個晚上的摸索,終於成功了,(初學者就這樣吧,還是不要要求太多了......)

下面是代碼:

——————————————————————————

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>

 


int main()
{


int a[1001];//數組
int N;//需要輸出素數的個數
int M;//計算中間數
printf("親,要多少個素數呢?不要大於1000哦.\n");
scanf("%d",&N);
a[0]=2;//賦值給兩個特殊的質數
a[1]=3;
int m1=1;//循環2控制變量

int M1;//M1:求余分子最大數
int j;
/*-------------------循環體---------------------*/
for(int i=1;i<N;i++)//for1:從最小以此找出素數
{
m1=1;
for(M=a[i]+2;m1;M=M+2)//for2:分母+2直至符合素數條件,分子
{
M1=(int)sqrt(M)+1;//計算求余運算的最大分子
for(j=1;j<=i;j++)//for3:從最小的素數開始求余
{
if(a[j]<M1)//判斷求余分子是否足夠大

{//不夠大時,計算是否能被整除
if(M%a[j]==0)//如果被整除

{
j=i+1;//促使for3 循環結束

}
else//不能被整除
{
}
}
else
{
a[i+1]=M;//足夠大賦值給數列
j=i+1;//for3跳出

m1=0;//for2跳出
}
}
}
}
for(int iii=0;iii<N;iii++){printf("%7d,",a[iii]);}

printf("\n");

getch();
return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM