题目链接:B3750 [信息与未来 2019] 幸运素数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
目的:练习埃氏筛法
解题思路:
①用埃氏筛法将m内的所有素数找到并存入定义的动态数组prime里面
②用for循环,在开始前先用int a=i,因为要进行除法运算,会改变i的大小,但是题目要求输出符合要求的i值,所以用a存,便于后续输出。
③若a<10,则直接进行if判断,在prime中找是否有a,有则直接输出。
若a>10则进入else,在prime中找此时的a,有则进行a/=10去掉末尾,在进行判断,在prime中找是否有此时的a,如此循环,直到a变成个位数且a在prime中仍然能够找到,则输出a。 若有一次不能找到都直接跳过,不输出。
代码:
#include<bits/stdc++.h>
using namespace std;
const int nmax=10000;
int v[nmax]={0};
vector<int>prime;
void E_sieve(int m) //埃氏筛法
{
for(int i=2;i<=m;i++){
if(!v[i]) prime.push_back(i);
for(int j=2*i;j<=m;j+=i)
v[j]=1;
}
}
int main()
{
int n,m;
cin>>n>>m;
E_sieve(m); //埃氏筛法将m内的素数找到
for(int i=n;i<=m;i++){
int a;
a=i;
auto it=find(prime.begin(),prime.end(),a); //vector没有find()函数,则要借用<algorithm>的,用auto定义方便 ,此时的auto相当于 vector<int>::iterator
if(a<10) {
if(!(it==prime.end())) cout<<i<<endl;
}
else{
while(a>10){
auto it=find(prime.begin(),prime.end(),a);
if(it==prime.end()) break; //没找到
else
a/=10;
auto its=find(prime.begin(),prime.end(),a); //要再定义依次,因为这里面的a改变了
if(a<10) if(!(its==prime.end())&&a!=1) cout<<i<<endl;
}
}
}
return 0;
}
总结与讨论:
①运用埃氏筛法更高效率的将规定范围内的素数存起来。
②用vector动态数组,便于后期在存素数的数组里面找到对应素数。
(注意:此时不能写为prime.find(a),因为在动态数组里面是没有find()函数的,要借用<algorithm>,即书写为auto it=find(prime.begin(),prime.end(),a);)
③用auto方便