zoukankan      html  css  js  c++  java
  • 筛选法求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 << "	组:" << 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;
    }
    

    运行结果

    image-20211030230359944

    image-20211030230416420

    筛选法

    QQ图片20211030230503

  • 相关阅读:
    生成排列与生成子集
    赛后总结AtCoder Beginner Contest 090(Beginner)
    树状数组笔记
    论怎么记住tarjan的板子
    tarjan缩点-受欢迎的牛-笔记
    tarjan模板(%%%hzwer)-2.0
    tarjan模板(%%%hzwer)
    匈牙利算法学习笔记
    最短路-Car的旅行路线
    数据结构 笔记1 搜索树
  • 原文地址:https://www.cnblogs.com/studentWangqy/p/15487868.html
Copyright © 2011-2022 走看看