PAT1013数素数C++

PAT1013数素数
题目:
1013 数素数 (20分)
令 P​i 表示第 i 个素数。现任给两个正整数 M≤N≤10​000,请输出 PM到 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
代码:

#include
#include
using namespace std;

int main()
{
     
	int M,N;
	cin>>M>>N;
	int a[10000];    //存储素数值,数组下标代表了是第几个素数
	int k=0,m=0;
	int flag;
	int i=2;
	a[0]=2;      //指明第一个素数
	while(k<=N) 
	{
     
		flag=0;
		for(int j=2;j<=sqrt(double(i));j++)    //1.sqrt()里面是double型 的数,但i是int型的,要转化一下
		                                       //2.若直接用j
		{
     
			if(i%j==0)
			{
     
				flag=1;
				break;
			}
		}
		if(flag==0)
		{
     
			k++;
			a[k]=i;
		}
		i++;
	}
	for(int i=M;i<N;i++)
	{
     
		cout<<a[i];
		m++;
		if(m%10==0)     //设置输出格式
			cout<<endl;
		else
			cout<<' ';
	}
	cout<<a[N];
	system("pause");
	return 0;
}

注意:

  1. 最开始,我用的是一个for循环来限制值,这样不好确定 i 的范围。网上查了一下第10000个素数大概是10500左右,但这样每次都要计算出10000个素数,不太方便。也可能会产生运行超时,第四个测试点通不过的问题。后来选用一个while循环,改善了一下。
    for(int i=0;i<10500;i++)
    {
    }
  2. 最开始在判断一个数 i 是否为素数时,我采用的是用 i 除以 从2到i-1的所有数,看看余数是否为0;这样会导致运行超时,第四个测试点通不过,改善了一下,用 i 除以从2 到sqrt(i) 的所有数,这可能是这道题要考察的点,要学会适当优化程序。

你可能感兴趣的:(c++,算法)