方法一:
#include
#define PRIME_SUM 10 //素数总数
int prime[PRIME_SUM] = {2,3}; //先把2和3放到prime数组中
int prime_count = 2; //素数计数,目前已有2和3两个素数
voID generate_prime()
{
for(int number = 5; number < 100000000; number = number + 2) //对从5开始的每个奇数进行判断
{
int is_prime = 1;
//当number = 53时,会用3、5、7去除
//当number = 65时,会用3和5去除,用5除时不行
for(int prime_index = 1; prime[prime_index] * prime[prime_index] <= number; prime_index++)
{
if(number % prime[prime_index] == 0) //若number能被当前素数整除,则number非素数
{
is_prime = 0;
break;
}
}
if(is_prime)
prime[prime_count++] = number; //number通过考验,欢迎加入素数大家庭~
if(prime_count == PRIME_SUM) //已经生成PRIME_SUM个素数,收工~
break;
}
}
int main()
{
generate_prime();
for(int prime_index = 0; prime_index < PRIME_SUM; prime_index++)
printf("%dn",prime[prime_index]);
return 0;
}
方法二:
#include
#define PRIME_UPPER_BOUND 1000000 //素数上界,生成小于该值的所有素数
int is_prime[PRIME_UPPER_BOUND];
//将所有素数初始为0
int prime[PRIME_UPPER_BOUND] = {0};
int generate_prime()
{
//将所有元素初始化为1,即先假定所有数都为素数。如is_prime[5] = 1,表示5为素数
for(int index = 0; index < PRIME_UPPER_BOUND; index++)
is_prime[index] = 1;
int prime_count = 0; //用来计算素数个数
//divisor:除数,起到筛子的作用
for(int divisor = 2; divisor * divisor <= PRIME_UPPER_BOUND; divisor++)
{
//若divisor为素数,则把所有的倍数(自身除外)淘汰。比如divisor = 3是素数,
//则把6、9、12等数给淘汰
if(is_prime[divisor]) //4被2筛除过,无须作筛子;9被3筛除过,无须作筛子
{
int n_divisor = divisor + divisor;
while(n_divisor <= PRIME_UPPER_BOUND)
{
is_prime[n_divisor] = 0; //将divisor的倍数(自身除外)判为非素数
n_divisor = n_divisor + divisor; //下一个倍数
}
}
}
for(int number = 2; number <= PRIME_UPPER_BOUND; number++)
{
if(is_prime[number]) //若number是素数,则将其加入到素数大家庭
prime[prime_count++] = number;
}
return prime_count;
}
int main()
{
int prime_sum = generate_prime();
for(int prime_index = 0; prime_index < prime_sum; prime_index++)
printf("%dn",prime[prime_index]);
printf("prime_sum: %dn",prime_sum);
return 0;
}
总结以上是内存溢出为你收集整理的素数生成算法_C语言版@FDDLC全部内容,希望文章能够帮你解决素数生成算法_C语言版@FDDLC所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)