求素数问题:
eg:输出n以内的素数。
#include <stdio.h>
#define maxn 100000
int prime[maxn];
int visit[maxn];
void Prime()
{
for (int i = 2; i <= maxn; i++)
{
if (!visit[i])
prime[++prime[0]] = i;//纪录素数,这个prime[0]用来记录当前质数组的个数
for (int j = 1; j <= prime[0]; j++)
{//访问素数组
if (i * prime[j] > maxn)//判定是否越界
break;
visit[i * prime[j]] = 1;
if (i % prime[j] == 0)
break;//目的是 判断 下一次循环所消的数 的最小质因子 是否 比此时的prime[j]大 具体分析位于代码块下
}
}
}
int main()
{
Prime();
printf("%d\n", prime[0]);
for (int i = 1; i < maxn; i++)
{
printf("%10d%5d%5d\n", i, prime[i], visit[i]);
}
return 0;
}
分析如下:
if (i % prime[j] == 0)
break;
下一次进入循环时应该消去的数为 i
∗
*
∗prime[j+1]
若在进入之前判断是否满足i%prime[j],则有i=k
∗
*
∗prime[j]
则应消去的数可写成k
∗
*
∗prime[j]
∗
*
∗prime[j+1]
由于素数数组一定是递增的,故prime[j+1]>prime[j]
明显得到应消数的最小质因子不是prime[j+1] 而是prime[j],
此时跳出循环不准备消i
∗
*
∗prime[j+1]是因为此时对应的 i 太小