洛谷 B3750 [信息与未来 2019] 幸运素数

题目链接: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方便

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值