思路:
我一开始的思路 就是 找出 前10000万个数组 然后 直接打印即可 ;
代码:
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
int isprime(int a) // 判断是否是素数
{
if (a%2==0&&a!=2)
{
return 0;
}
for (int i=3;i<=sqrt(a) ;i++ )
{
if (a%i==0)
{
return 0;
}
}
return a!=1;
}
int main()
{
int prime[100000]={0};
int j=1;
for (int i = 0; i < 100000; ++i)
{
if(isprime(i)) {
prime[j]=i;
j++;
}
}
int M,N;
cin>>M>>N;
int count=0;
for(int i=M;i<=N;i++)
{
if(count/10!=0&&count%10==0)
printf("\n");
if(count%10==0)
printf("%ld",prime[i]);
else
printf(" %ld",prime[i]);
count++;
}
return 0;
}
然后 结果19分 .... :
后来 试着把 数组的长度 开大了一点 ;
然后 :
竟然过了 !!!
可以可以。
两次 的代码 没什么不同 ,就只有 一开始 数组大小 100000,,后来 改为110000 结果 过了
后来想想 的确 是这样 。因为毕竟严格意义来说第10000个素数是多少 我们也不知道 ,一开始 肯定是小了 ,然后后来 够了。。。。
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
int isprime(int a) // 判断是否是素数
{
if (a%2==0&&a!=2)
{
return 0;
}
for (int i=3;i<=sqrt(a) ;i++ )
{
if (a%i==0)
{
return 0;
}
}
return a!=1;
}
int main()
{
int prime[110000]={0};
int j=1;
for (int i = 0; i < 110000; ++i)
{
if(isprime(i)) {
prime[j]=i;
j++;
}
}
int M,N;
cin>>M>>N;
int count=0;
for(int i=M;i<=N;i++)
{
if(count/10!=0&&count%10==0)
printf("\n");
if(count%10==0)
printf("%ld",prime[i]);
else
printf(" %ld",prime[i]);
count++;
}
return 0;
}
把上一个代码的100000 换成了110000 就20分过了 。