先放普通**:
#include using namespace std;
void getprime_1()
}for(i=0;i首先,根據最大數,判斷需要32的整型多少個:
bitn=(maxn/2)/32+1;
maxn/2
去除了所有偶數字,(maxn/2)/32+1
代表需要多少32位的整型。
其次,所有求位的操作,都要除以2以去除偶數字的影響。
同時:
for (j = i; j < maxn; j =j+i+i)
flag[(j/2) / 32] |= (1 << ((j/2) % 32));
其中的j=j+i+i;
是因為j和i本身都是乙個奇數,相加後為偶數,不考慮,所以還要加上乙個i。
通過這種方式,縮小了占用空間。
**檔案
當maxn=200
時,實際的素數只有45個,但primes的大小卻是66,那麼這裡怎麼能更進一步的優化呢?
由於這裡使用的c++,那麼為什麼不使用stl中已有的容器類bitset
呢:
#include void getprime_3()
}for(i=0;i可以看到,使用stl的**還是比較簡潔的!
剛才已經將偶數的計算去除了,但仍然還會有一部分的重複計算,比如:
i=3時,會訪問15
,同時,當i=5
時,也會訪問15
。
先上**:
void getprime_4()
}for(i=0;i注釋1表示讓當前奇數和已經查出來的素數進行逐個相乘,相乘後的結果數肯定不是素數!
注釋2對於任何數來說,如果它如果是該素數的倍數那麼它就不能再與素數表中該素數之後的素數相乘了,如9是3的倍數,所以在9*3之後就不能再去用計算9*5
了。
當資料量很大時,getprime_4()
和getprime_1()
的差別將在時間和空間上是很大的!
githubblog/
C 之位操作符
位操作符 將其整型運算元視為二進位制位的集合,為每一位提供檢驗和設定的功能。按位求反 左移,左移1相當於 2 其右運算元標識要左移動的位數,從而產生新的值,並丟棄移出去的位,在右邊插入0以補充空位。右移,右移1相當於 2 其有運算元標識要右移的位數,從而產生新的值,並丟棄移出去的位。如果右邊的運算元...
C 學習之typeid操作符
typeid操作符 include typeid 型別 物件 返回typeinfo物件,用於描述型別資訊 1 typeinfo類中包含了name 成員函式,可以獲取字串形式的型別資訊.2 typeinfo類支援比較操作符過載,可以直接進行型別之間比較 如果型別之間存在多型的繼承關係,typeid還可...
C語言高階 25 和 操作符使用分析
運算子 運算子用在預處理器期間將巨集引數轉換為字串 的轉換作用是在預處理器完成的,因此只在巨集定義中有效 編譯器不知道 的轉換作用 用法 define string x x printf s n string hello world 注意,並沒有出現雙引號對於下面 include define st...