洛谷P3912 素数个数

发布时间:2023-07-11 16:36:55

欧拉筛。
如果开int数组,最后一个测评内存会超。
改成short就过了。

#include 
#include 
#include 
#include 

int find_primes (int max, int **arr)
{
#define MAX_SIZE    max
	bool is_prime[MAX_SIZE];
	short primes[MAX_SIZE];
#undef MAX_SIZE
	//假定都是质数,下面开始筛掉合数
	memset (is_prime, true, sizeof (is_prime));
	
	is_prime[0] = is_prime[1] = false;
	int cnt = 0;
	for (int i = 2; i < max ; ++i) {
		if (is_prime[i]) primes[cnt++] = i;
		
		for (int j = 0; j < cnt && i * primes[j] < max; ++j) {
			is_prime[i * primes[j]] = false;//每个质数的倍数都不是质数
			if (i % primes[j] == 0) break;
			//说明i不是质数,存在primes[j]可以整除i,
			//此时无需再继续判断,因为i*primes[j]是合数,
			//更大的质数*i也是合数,只需要随着i的增加
			//就能用小的质数(primes[j])筛掉i对应的合数。
		}
	}
	int *cloned = malloc (sizeof (int) * cnt);
	memcpy (cloned, primes, sizeof (int) *cnt);
	*arr = cloned;
	return cnt;
	
}



int main (void)
{
	int *arr;
	
	int max;
	scanf ("%d", &max);
	printf ("%d", find_primes (max + 1, &arr));
}

你可能感兴趣的:(算法,算法,数据结构)