令 Pi 表示第 i 个素数。现任给两个正整数 ,请输出 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 89
97 101 103
解题思路:
首先解题思路一开始,打算用一个数组存储N个素数,然后再输出数组M-N里面的数组,起初我的想法就是开始定义为找100里面的素数,如果数量不够就开始100限制的范围开始扩大,但是就面临到了超时问题
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace::std;
int* arr;
bool isP(int num)
{
for (int i = 2; i < num; i++)
{
if (num % i == 0) return false;
}
return true;
}
int main(int argc, char* argv[])
{
int N, M;
cin >> N >> M;
arr = new int[M];
int j = 0;
int temp = 1, flag = 0;
int number = 100;
for (int i = 2; i < number; i++)
{
if (isP(i))
{
arr[j] = i;
j++;
}if (i == number - 1 && j < M) {
number = number*2;
}if (j == M + 1)
break;
}
for (int t = N -1; t < M; t++)
{
if (flag == 1) cout << " ";
cout << arr[t];
flag = 1;
if (temp == 10) {
printf("\n");
temp = 0;
flag = 0;
}
temp++;
}
return 0;
}
分析发现因为for循环如果遇到最坏的情况则会循环下去从而加大了运行时间所以这里把对素数的判断条件改了一下
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace::std;
//用数组存储素数
int* arr;
//判断该数是否为素数
bool isP(int num)
{
for (int i = 2; i <= sqrt(num); i++)
{
if (num % i == 0) return false;
}
return true;
}
int main(int argc, char* argv[])
{
//输入N,M
int N, M;
cin >> M >> N;
arr = new int[N];
int j = 0;
int temp = 1, flag = 0;
int number = 100;
for (int i = 2; i < number; i++)
{
//判断是否为素数,若为素数就存储
if (isP(i))
{
arr[j] = i;
j++;
//如果该数正好到了限制范围,但是数组未存满则扩大限制范围继续找数
}if (i == number - 1 && j < N) {
//这里用半倍扩容的方式
number = number+((number>>1)>1?number>>1:1);
//如果正好到了限制范围则停止循环此时的J正好为N+1
}if (j == N + 1)
break;
}
//如下按照题目要求进行输出输出M-N的素数
for (int t = M -1; t < N; t++)
{
if (flag == 1) cout << " ";
cout << arr[t];
flag = 1;
if (temp == 10) {
printf("\n");
temp = 0;
flag = 0;
}
temp++;
}
return 0;
}
改完后的运行效果