1013 数素数 (20分)
令 P
i
表示第 i 个素数。现任给两个正整数 M≤N≤10
4
,请输出 P
M
到 P
N
的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 P
M
到 P
N
的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
这题当时就是运行超时,想了很久,才发现这里检测很严,在给定1—10000范围内,第一万个素数恰好是104729,所以给定的范围i不能太大。
#include<iostream>
#include<math.h>
using namespace std;
bool judge(int n)//求素数模板
{if (n < 2) return false;for (int i = 2; i <= sqrt(n); i++){if (n % i == 0) return false;}return true;
}
int main()
{int m, n, count = 0, j = 0;//count记录素数个数,j用来控制换行,10个换一行cin >> m >> n;for (int i = 0; i <= 104729; i++){if (judge(i))//判断素数{count++;//记录加1if (count >= m && count <= n)//在给定空间内{if (j == 0)cout << i;//第一个数不为空格else if (j % 10 == 0 && j != 0)cout << endl << i;//换行else cout << " " << i;j++;}//取消下面注释可以查看第一万个素数大小。//if (count == 10000)//{// cout << i;//}}}
}
下面是柳神的代码
#include <iostream>
#include <vector>
using namespace std;
bool isprime(int a) {for (int i = 2; i * i <= a; i++)if(a % i == 0) return false;return true;
}
int main() {int M, N, num = 2, cnt = 0;cin >> M >> N;vector<int> v;while (cnt < N) {if (isprime(num)) {cnt++;if (cnt >= M) v.push_back(num);}num++;}cnt = 0;for (int i = 0; i < v.size(); i++) {cnt++;if (cnt % 10 != 1) printf(" ");printf("%d", v[i]);if (cnt % 10 == 0) printf("\n");}return 0;
}