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=0; } }q; int pd(int x) { if(x==2||x==3) return 1; if(x%2==0 || x==1) return 0; int j=3; while(j<=sqrt(x)&&x%j!=0) j+=2; if(x%j==0) return 0; else return 1; } void Q_work() { q.jiajia(); q.add(2); for(int i=3;;i++) { if(pd(i)) { q.jiajia(); q.add(i); } if(q.top>10000) break; } } int main() { scanf("%d",&n); Q_work(); cout<<q.s[n]; return 0; }
吓的我赶紧改掉结构体里面的初始化,样例过了???
交上:
#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==2||x==3) return 1; if(x%2==0 || x==1) return 0; int j=3; while(j<=sqrt(x)&&x%j!=0) j+=2; if(x%j==0) return 0; else return 1; } void Q_work() { q.jiajia(); q.add(2); for(int i=3;;i++) { if(pd(i)) { q.jiajia(); q.add(i); } if(q.top>10000) break; } } int main() { scanf("%d",&n); Q_work(); printf("%d",q.s[n]); return 0; }
还是不对???
然后删掉结构体:
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==2||x==3) return 1; if(x%2==0 || x==1) return 0; int j=3; while(j<=sqrt(x)&&x%j!=0) j+=2; if(x%j==0) return 0; else return 1; } void Q_work() { s[++top]=2; for(int i=3;;i++) { if(pd(i)) { s[++top]=i; i++; } if(top>10000) break; } } int main() { scanf("%d",&n); Q_work(); printf("%d",s[n]); return 0; }
然而想不通的是:为什么不能使用结构体??
赶紧请教大佬,结果出人意料的错误出现了,详细请看代码:
#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=0; } int s[M]; void jiajia() { top++; } int add(int x) { s[top]=x; } }q; int pd(int x) { if(x==2||x==3) return 1; if(x%2==0 || x==1) return 0; int j=3; while(j<=sqrt(x)&&x%j!=0) j+=2; if(x%j==0) return 0; else return 1; } void Q_work() { q.jiajia(); q.add(2); for(int i=3;;i++) { if(pd(i)) { q.jiajia(); q.add(i); } if(q.top>10000) //因为结束条件是q.top>10000所以需要使用到10001个,所以数组需要开到10002 //if(q.top>=10000) 或者上面不改,改这里 break; } } int main() { scanf("%d",&n); Q_work(); printf("%d",q.s[n]); return 0; }
End.