• 筛选法求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

  • 相关阅读:
    使用Spring MVC统一异常处理实战(转载)
    java 异常
    Java 接口和内部类
    JAVA 继承
    Linux中profile(转载)
    java 对象与类
    Java基本的程序结构设计 数组
    Python虚拟机函数机制之位置参数(四)
    Python虚拟机函数机制之参数类别(三)
    Python虚拟机函数机制之名字空间(二)
  • 原文地址:https://www.cnblogs.com/studentWangqy/p/15487868.html
Copyright © 2020-2023  润新知