题目描述
令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。
输入描述:
输入在一行中给出M和N,其间以空格分隔。
输出描述:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入例子:
5 27
输出例子:
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 8997 101 103
#include <iostream> using namespace std; int main() { int M; int N; cin >> M >> N; int Snum[11000]; int k = 0; int i; int j; Snum[k++] = 2;//定义第一个质数为2 //得到质数数组 for (i = 3; i <= 110000; i++) { for (j = 0; j*j < k; j++) { if (i%Snum[j] == 0)break; } if (j*j >= k) { Snum[k++] = i; } } int count = 0; for (i = M-1; i < N; i++) { count++; if (count % 10 == 0)//没有余数 { cout <<Snum[i]<<endl; continue;//跳出当前循环,进入下一次循环 } if (i == N - 1) { cout << Snum[i] << endl; break; } cout << Snum[i] << " "; } return 0; }
关于求素数的两种方法:一、一个数 n 如果是合数,那么它的所有的约数不超过sqrt(n)。
#include<stdio.h> #include<math.h> using namespace std; int main(){ void getPrimes(int x); getPrimes(100000000); } void getPrimes(int x) { int prime[x]; //define a prime[] for (int i = 0; i < x; i++) { prime[i] = 0; //init prime[] } int i, j, num = 0; for (i = 2; i < x; i++) { for (j = 2; j <= sqrt(i); j++) { if (i % j == 0) break; } if (j > sqrt(i)) prime[num++] = i; } for (i = 0; i < x; i++) { if (prime[i]) printf("%d ",prime[i]); } printf("\n"); }
二、素数筛法(千万级别的数字都可以出来!!!)#include <stdio.h> #include <math.h> #define N 105 int prime[N]; int main() { int i, j; //1.开一个大的boolean型数组prime[],先把所有的下标为奇数的标为true,下标为偶数的标为false. if (N > 2) { prime[2] = 1; //因为2这个数字比较特殊,先将prime[2]设为true } for (i = 2; i < N; i++) { //奇数单元设为true if (i % 2) { prime[i] = 1; } } //2.原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。 //如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质数的倍数筛掉。 for (i = 3; i <= sqrt(N); i++) { if (prime[i]) {//如果primr[i]为奇数 for (j = i + i; j < N; j += i) { prime[j] = 0; } } } //输出 for (i = 2; i < N; i++) { if (prime[i])//输出被标记为true的数字 printf("%d ", i); } return 0; }