搜索
查看: 210|回复: 1

求第10001个质数超时,求助!

[复制链接]
 楼主| 发表于 2019-4-6 23:00:43 | 显示全部楼层 |阅读模式
5啊哈币
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,j,n,m,k;
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,j,n,m,k;
    scanf("%d",&n);
    if(n==1)
        printf("2");
    k=0;
    for(i=3;i!=0;i+=2)
    {
        m=0;
        for(j=2;j<i;j++)
        {
            if(i%j==0)
            m=1;
        }
        if(m==0)
            k++;
        if(k==n-1)
            break;
    }
    printf("%d",i);
    system("pause");
    return 0;
}

发表于 2019-4-7 12:34:13 | 显示全部楼层
超时主要有两个原因。
1、不要用system("pause")。你平时自己写代码的时候可以用,但是提交给网上进行测评的时候是不可以用的。因为,如果你谢了system("pause"),那么在按下回车键之前,程序会一直停在这个地方。但是,网上测评的时候,电脑不会帮你按下回车键,因此程序会一直停在这个位置不动,从而导致超时。因此,平时自己写代码的时候用用system("pause")就好,但是在提交之前,一定要先删除或者注释掉system("pause")
2、你个这个找质数的方法实在是太慢了,建议你去学一下一些筛选质数的方法。线性筛选质数可能对你们来说太难了,但是你们可以学一下普通筛选法--埃拉托斯特尼筛法。虽然可能会比线性筛质数会慢一点,但是已经很快了,足以解决你的这个问题。下面是我的代码。
  1. #include<cstdio>
  2. using namespace std;
  3. const int N=1000000;
  4. bool v[N];//这个数组用来存储哪一个数是质数。1表示合数,0表示质数
  5. int main()
  6. {
  7.         int n;
  8.         scanf("%d",&n);
  9.         for(long long i=2;1;i++)
  10.         {
  11.                 if(v[i]) continue;//如果v[i]==1,表示是合数,忽略
  12.                 //话说,你们应该知道continue有什么用吧?不知道的话去查一下
  13.                 n--;
  14.                 if(!n)//!n其实和n==0是一样的。因为,只要当n==0的时候,!n才等于true
  15.                 {
  16.                         printf("%lld\n",i);//当n减到0的时候,就是找到了第n个质数
  17.                         return 0;
  18.                 }
  19.                 for(long long j=2;i*j<N;j++)//这一步就是筛选质数了,原理请参考普通筛选法--埃拉托斯特尼筛法
  20.                 {
  21.                         v[i*j]=1;
  22.                 }
  23.         }
  24.         return 0;
  25. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表