筛选法求2000以内的连续10个以上的非素数的组
题目
代码
/* 求2000以内的,10个以上的非素数数组*/
#include <iostream>
using namespace std;
#define RANGE 2000 // 范围 2000以内
#define M 10 // 连续个数 10个以上连续
bool iscomposite(int num);
int main()
{
bool composite[RANGE+1] = {0}; //composite 合数
for (int i = 2; i < RANGE + 1; i++) // 筛选法 确定大部分合数
{
for (int j = 2; i * j < RANGE + 1; j++)
{
composite[i*j] = true;
}
}
for (int i = 1; i < RANGE + 1; i++) // 少部分尚未确定的数 再用传统方法计算
{
if (!composite[i])
{
composite[i] = iscomposite(i);
}
}
int prev = 2; // 记录最后一次遇到素数的位置 初始为 2
int curr = 2; // 记录当前所在位置 用于遍历
int count = 0;// 记录到目前为止,有多少组符合条件
while (curr < RANGE + 1)
{
if (composite[curr] && !composite[curr+1] || curr == RANGE) // 当前是合数 并且后一个就是质数 或者 curr 已经到底 优先级 && 高于 ||
{
if (curr - prev > M) // curr - prev 代表连续合数的个数
{
count ++;
cout << "第" << count << " 组:" << prev + 1 << " ---" << curr << endl;
}
}
if (!composite[curr])
prev = curr;
curr ++; // 记得更新当前位置
}
return 0;
}
// iscomposite 判断一个数是否为合数
// bug : 把 1 也视为合数
bool iscomposite(int num)
{
if (num < 2)
return true;
int i = 2;
for (i = 2; i * i <= num; i++)
{
if (num%i == 0)
return true;
}
return false;
}
运行结果
筛选法