问题:
列出素数,问题规模较大时
解法:
#include "stdafx.h"
#include <cstring>
using namespace std;
int prime[1100000], primesize, phi[11000000];
bool isprime[11000000];
void getlist(int listsize)
{
memset(isprime, 1, sizeof(isprime)); //初始化所有的数都是素数
isprime[1] = false; //1不是素数
for (int i = 2; i <= listsize; i++) //从2开始逐一审查
{
if (isprime[i]) //如果是素数的话
prime[++primesize] = i; //结果素数表里新增i
for (int j = 1; j <= primesize && i*prime[j] <= listsize; j++)//遍历之前所有确定的素数表,
{
isprime[i*prime[j]] = false; //排除掉i倍的合数
if (i%prime[j] == 0) //保证每个合数只会被第一个(最小的)素因数乘
//当i能被prime[j]整除时,即i = prime[j]*k
//i*prime[j+1]=(k*prime[j])*prime[j + 1] = k’ * prime[j]
break;
}
}
}
重点在于if(i%prime[j]==0) break;这句,当i%prime[j]即 i = k*prime[j],则有i*prime[j+1]=k*prime[j]*prime[j+1]= k'*prime[j]
其中,k'= k*prime[j+1],可以保证,k'*prime[j]在早前会被执行到所以跳过prime[j+1]