题目描述
对一个素数,若其含有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;
}