学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴请你求出ab之间(包含a和b)的所有质数,并按照从小到大的顺序输出,如果ab之间没有质数,只输出-1。
【输入】
一行两个整数a和b。
【输出】
一行若干个整数。
【输入样例】
1 10
【输出样例】
4
2 3 5 7
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7+10;
typedef long long LL;
int prime[N], m;
bool vis[N];
void primes(int n)
{
vis[0] = vis[1] = 1; // 0是合数 1是合数
for (int i=2; i<=n; i++) { // 让每个数都来当帮手
if (!vis[i]) { //这个帮手是质数的话就进百宝箱
prime[m]=i;
m++;
}
//欧拉筛 从百宝箱中取质数出来 跟帮手一起 筛
for (int j=0; j<m && prime[j]*i<=n; j++) {
vis[prime[j]*i]=1;
if (i%prime[j]==0)
break;
}
}
}
int main()
{
LL L, R;
cin >> L >> R;
primes(50000);
memset(vis, 0, sizeof vis);
// 质数百宝箱,用每一个质数去筛
for (int i=0; i<m; i++) {
LL p = prime[i];
for (LL j=max((int)ceil(1.0*L/p)*p,2*p); j<=R; j+=p) { // 设置2*p作为最小值,因为不能用p
vis[j-L] = 1;
}
}
m = 0;
for (LL i=L; i<=R; i++) {
if (!vis[i-L] && i!=1) prime[m++] = i;
}
if (m==0) m = -1;
cout << m << endl;
for (int i=0; i<m; i++) {
cout << prime[i] << " ";
}
return 0;
}
【运行结果】
1 10
4
2 3 5 7