筛选法求2000以内的10个以上连续非素数组

筛选法求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 << "\t组:" << prev + 1 << "\t---" << 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;
}

运行结果

image-20211030230359944

image-20211030230416420

筛选法

QQ图片20211030230503

posted @ 2021-10-30 23:09  lucky_doog  阅读(260)  评论(0编辑  收藏  举报