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;
}
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==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;
}
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==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;
}
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=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;
}
4

 

 

 

 

 

End.

posted @ 2017-04-19 18:13  夜雨声不烦  阅读(980)  评论(0编辑  收藏  举报