素数筛(1e7内包含4的素数有多少个)

题目描述

对一个素数,若其含有4,则称其为四素数,如41,149就是四素数,问1e7以内四素数有多少个。

输入描述:

输出描述:

1e7 以内四素数的个数
题目分析

如果用平时一般写法:即写一个函数,对于每个数n,从2遍历到sqrt(n),看是否有数可以整除该数,来判断一个数是不是素数;然后从1到1e7逐个判断是不是素数,以及是否包含4。这种写法,对于范围在1e6之内的情况可以在1000ms内解决,但是超出该范围就会超时,所以不能使用该方法求解。
所以需要采用另外一种解法,叫做素数筛,即通过已经知道的素数,对后面的数字做标记,没有被标记的是素数,被标记的不是素数,把素数存入到相应的数组,然后只需要对素数数组的数字进行判断是否符合条件即可。

用到知识点:素数筛
const int maxnum = 1e7;
//prime[]数组用来存素数(下标从1开始)
//prime[0]用来存素数的个数
int prime[maxnum];
void getPrime(){
	for(int i=2; i<maxnum; i++){
		if(prime[i]==0){//数字i没有被标记,说明数字i是素数,把i存入数组prime[]中,代表素数个数的prime[0]自增1
			prime[++prime[0]]=i;
		}
		for(int j = 1;j<=prime[0]&&i*prime[j]<=maxnum;j++){
			prime[i*prime[j]]=1;//是该素数的倍数的肯定不是素数,标记为1
			if(i%prime[j]==0) break;//该语句有一套数学推导,此处不多做解释
		} 
	}
}
答案
310456
答案代码:
#include<bits/stdc++.h>
using namespace std;

const int maxnum = 1e7;
int prime[maxnum];
//素数筛
void getPrime(){
	for(int i=2; i<maxnum; i++){
		if(prime[i]==0){
			prime[++prime[0]]=i;
		}
		for(int j = 1;j<=prime[0]&&i*prime[j]<=maxnum;j++){
			prime[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		} 
	}
}
//判断该数包不包含4
bool have4(int n){
	while(n!=0){
		if(n%10==4) return true;
		n/=10;
	}
	return false;
}

int main(){
	//执行该方法,把素数放入prime[]数组
	getPrime();
	int count = 0;
	//prime[0]用来存素数的个数,遍历每一个素数,符合条件计数器自增1
	for(int i=1;i<=prime[0];i++){
		int aa = prime[i];
		if(have4(aa)){
			count++;
		}
	}
	cout<<count;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值