我遇到了问题陈述中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,它也处理大整数。需要帮助。
答案 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实现。散列表的操作在现代计算机上通常比在树上的操作更快。