优化素数序列

时间:2017-07-19 08:01:51

标签: c++ algorithm analysis

我遇到了问题陈述中Codechef练习问题困难的问题:

  

Shridhar希望为他的密码系统生成一些素数。   帮助他!你的任务是生成两个给定的所有素数   编号

Rest of the description, I/O format, Test cases examples on this question link

我的实施问题是获得TLE(超出时间限制)并希望解决这个问题,你能指出我的实施中的任何问题,我似乎无法在经过几个小时的干运行后弄明白。< / p>

包含,指令和ifPrime功能

#include<map>
#include<math.h>
#include<stdio.h>
#define LLD long long int
#define REPNE(i,a,b) for(LLD i=a; i<=b; ++i)
#define REPNEI(i,a,b,k) for(LLD i=a; i<=b; i+=k)
using namespace std;

map<LLD, bool> mem;

bool ifPrime ( LLD a ) {
    if ( a<2 ) return false;
    else if ( a==2 ) return true;
    else if ( a%2==0 ) return false;

    REPNEI(i,3,sqrt(a),2) {
        if ( a%i==0 ) return false;
    }

    mem[a] = true;
    return true;
}

生成素数函数

void genPrime ( LLD a, LLD b ) {
    REPNE(i,a,b) {
        if ( mem.find(i) != mem.end() ) printf("%lld\n", i);
        else if ( ifPrime(i) ) printf("%lld\n", i);
    } printf("\n");
}

主要

int main ( ) {
    // freopen("input.txt", "r", stdin);

    int t; scanf("%d", &t);
    REPNE(test, 1, t) {
        LLD a, b;
        scanf("%lld %lld", &a, &b);

        genPrime(a,b);

    }
} 

我想不出另一个解决这个问题的方法,我提出的唯一方法是memoization,它也处理大整数。需要帮助。

2 个答案:

答案 0 :(得分:3)

该方法存在一个问题,即它正在生成memoization密钥,值对。可能他们应该立即进行测试,而不是保存它们。

一个简单的解决方案是迭代范围m<=x<=n,然后使用优化的质数检查器算法检查数字是否为素数,该算法需要大约(O((nm)^ 1/2)),这是安静的对于非常大的数字而言。

Prime函数

bool ifPrime ( int n ) {
    if ( n==2 ) return true;
    else if ( n%2==0 || n<=1 ) return false;
    for ( int i=3; i<=sqrt(n); i+=2 ) {
        if ( n%i==0 ) return false;
    }

    return true;
}

你主要是

int main ( ) {
    int t; scanf("%d", &t);
    REPNE(test, 1, t) {
        LLD a, b;
        scanf("%lld %lld", &a, &b);

        REPNE(i,a,b) {
            if ( ifPrime(i) ) printf("%lld\n", i);  
        } printf("\n");
    }
} 

我已尝试根据您的宏定义进行编码,希望有所帮助:)

答案 1 :(得分:0)

您应该考虑使用std :: unordered_map而不是std :: map。通常std :: map用树和带有哈希表的std :: unordered_map实现。散列表的操作在现代计算机上通常比在树上的操作更快。