noi 第n小的质数

时间:2023-03-10 04:08:49
noi 第n小的质数
总时间限制: 
1000ms

内存限制: 
65536kB
描述

输入一个正整数n,求第n小的质数。

输入
一个不超过10000的正整数n。
输出
第n小的质数。
样例输入
10
样例输出
29

一定要注意范围范围范围!!!!
开数组一定要注意!!!!!!
第一次很装逼的用了结构体,毕竟是会的东西之一,结果:
Runtime Error
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define M 10001 using namespace std;
int n;
struct Q{
int top;
int s[M];
void jiajia()
{
top++;
}
int add(int x)
{
s[top]=x;
}
Q()//初始化
{
top=;
}
}q; int pd(int x)
{
if(x==||x==) return ;
if(x%== || x==) return ;
int j=;
while(j<=sqrt(x)&&x%j!=) j+=;
if(x%j==) return ;
else return ;
} void Q_work()
{
q.jiajia();
q.add();
for(int i=;;i++)
{
if(pd(i))
{
q.jiajia();
q.add(i);
}
if(q.top>)
break;
}
} int main()
{
scanf("%d",&n);
Q_work();
cout<<q.s[n];
return ;
}

1

吓的我赶紧改掉结构体里面的初始化,样例过了???

交上:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define M 10001 using namespace std;
int n;
struct Q{
int top;
int s[M];
void jiajia()
{
top++;
}
int add(int x)
{
s[top]=x;
}
}q; int pd(int x)
{
if(x==||x==) return ;
if(x%== || x==) return ;
int j=;
while(j<=sqrt(x)&&x%j!=) j+=;
if(x%j==) return ;
else return ;
} void Q_work()
{
q.jiajia();
q.add();
for(int i=;;i++)
{
if(pd(i))
{
q.jiajia();
q.add(i);
}
if(q.top>)
break;
}
} int main()
{
scanf("%d",&n);
Q_work();
printf("%d",q.s[n]);
return ;
}

2

还是不对???

然后删掉结构体:

A了……

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define M 10001 using namespace std; int n,top;
int s[M]; int pd(int x)
{
if(x==||x==) return ;
if(x%== || x==) return ;
int j=;
while(j<=sqrt(x)&&x%j!=) j+=;
if(x%j==) return ;
else return ;
} void Q_work()
{
s[++top]=;
for(int i=;;i++)
{
if(pd(i))
{
s[++top]=i;
i++;
}
if(top>)
break;
}
} int main()
{
scanf("%d",&n);
Q_work();
printf("%d",s[n]);
return ;
}

3

然而想不通的是:为什么不能使用结构体??

赶紧请教大佬,结果出人意料的错误出现了,详细请看代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
//#define M 10001就是这里!!数组开小了应该再加一!!!
#define M 10002 using namespace std; int n; struct Q{
int top;
Q()
{
top=;
}
int s[M];
void jiajia()
{
top++;
}
int add(int x)
{
s[top]=x;
}
}q; int pd(int x)
{
if(x==||x==) return ;
if(x%== || x==) return ;
int j=;
while(j<=sqrt(x)&&x%j!=) j+=;
if(x%j==) return ;
else return ;
} void Q_work()
{
q.jiajia();
q.add();
for(int i=;;i++)
{
if(pd(i))
{
q.jiajia();
q.add(i);
}
if(q.top>) //因为结束条件是q.top>10000所以需要使用到10001个,所以数组需要开到10002
//if(q.top>=10000) 或者上面不改,改这里
break;
}
} int main()
{
scanf("%d",&n);
Q_work();
printf("%d",q.s[n]);
return ;
}

4

End.