Liên kết của Marc B hiển thị một thuật toán đơn giản và tốt đẹp, chính xác, được viết bởi NSLogan. Tôi đã viết một sửa đổi nhỏ cho nó để hiển thị một số kích thước/tốc độ cân bằng. Tôi nghĩ tôi sẽ chia sẻ vì lợi ích.
Thứ nhất, mã:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <time.h>
#define USE_BITS
#ifdef USE_BITS
#define alloc_prime char *prime = calloc(i/8,sizeof(*prime));
#define set_not_prime(x) prime[x/8]|= (1<<(x%8))
#define is_prime(x) (!(prime[x/8]&(1<<(x%8))))
#endif
#ifdef USE_CHAR
#define alloc_prime char *prime = calloc(i,sizeof(*prime));
#define set_not_prime(x) prime[x] = 1
#define is_prime(x) (prime[x] == 0)
#endif
#ifdef USE_SIZE_TYPE
#define alloc_prime size_t *prime = calloc(i,sizeof(*prime));
#define set_not_prime(x) prime[x] = 1
#define is_prime(x) (prime[x] == 0)
#endif
int main(){
int i;
printf("Find primes up to: ");
scanf("%i",&i);
clock_t start, stop;
double t = 0.0;
assert((start = clock())!=-1);
//create prime list
alloc_prime;
int c1, c2, c3;
if(!prime){
printf("Can't allocate %zu bytes!\n",i*sizeof(*prime));
exit(1);
}
//set 0 and 1 as not prime
set_not_prime(0);
set_not_prime(1);
//find primes then eliminate their multiples (0 = prime, 1 = composite)
for(c2 = 2;c2 <= (int)sqrt(i)+1;c2++){
if(is_prime(c2)){
c1=c2;
for(c3 = 2*c1;c3 <= i+1; c3 += c1){
set_not_prime(c3);
}
}
}
stop = clock();
t = (double) (stop-start)/CLOCKS_PER_SEC;
//print primes
for(c1 = 0; c1 < i+1; c1++){
if(is_prime(c1))printf("%i\n",c1);
// if(prime[c1] == 0) printf("%i\n",c1);
}
printf("Run time: %f\n", t); //print time to find primes
return 0;
}
(Hãy tha thứ được thông báo lỗi vì không chính xác khi USE_BITS được định nghĩa ...)
Tôi đã so sánh ba cách khác nhau để lưu trữ các biến boolean peoro gợi ý. Một phương pháp thực sự sử dụng bit, thứ hai lấy toàn bộ byte, và phương thức cuối sử dụng toàn bộ từ máy. Một dự đoán ngây thơ về cái nào là nhanh nhất có thể là phương pháp từ máy, vì mỗi cờ/boolean được xử lý nhiều hơn một cách tự nhiên bởi máy của bạn. Timings để tính toán số nguyên tố lên đến 100.000.000 trên máy tính của tôi như sau:
Bits: 3.8s Chars: 5.8s M-chữ: 10.8s
Thật thú vị khi lưu ý rằng ngay cả xấu xí bit-shifting cần thiết để đại diện cho một boolean chỉ với một bit vẫn còn nhanh hơn tổng thể. Giả thuyết của tôi là bộ nhớ đệm và địa phương-tham chiếu dường như lớn hơn thêm ~ 3 hướng dẫn. Thêm vào đó, bạn sẽ sử dụng 1/nth bộ nhớ của phương pháp n-bit-machine-word!
Vâng, sàng đơn giản chậm. Nếu bạn đăng những gì bạn có cho đến nay, có thể ai đó có thể giúp bạn cải thiện nó. – aschepler
Đăng mã của bạn, vui lòng – Elalfer
5 giây googling: http://www.dreamincode.net/code/snippet3315.htm –