您的位置:首页 > 产品设计 > UI/UE

POJ-priority queue练习题:比较质因数个数

2014-05-08 21:56 295 查看
题目描述:



问题重点在实现效率上,主要分3块提高效率:(N = 10000000)

1.查找 1~sqrt(N) 的所有质数,利用埃斯托斯特尼筛法。只考虑到sqrt(N)是因为1~N的数只可能有一个大于sqrt(N)的质因子,这点在质因子计算时很好判断;

2.计算1~N之间的某数x的质因子数目,计算时利用上面1建立的质数表,同时在计算过程中利用x的质因子更新x(相除)来提高速度;

3.最后利用pair数据结构记录每个数及其质因子数目,以免每次比较需要重新计算质因子数目;(这步很管用)

具体实现代码如下:

#include <iostream>
#include <queue>
#include <bitset>
using namespace std;

bitset<3200> tab;

int getNum(int k){
int num = 0;
for(int j = 2; j < 3200 && j < k; j++){
if(tab[j] == 0 && k % j == 0){
while(k % j == 0)
k /= j ;
num ++ ;
if(k == 1) break ;
}
}
if(k == 1)
return num;
else if(num == 0)
return 0;
else
return num + 1;
}

class MyLess{
public:
bool operator() (pair<int,int> a, pair<int,int> b){
int num1 = a.first, num2 = a.first;
if(num1 < num2)
return true;
else if(num1 == num2)
return a < b;
else
return false;
}
};

class MyGreater{
public:
bool operator() (pair<int,int> a, pair<int,int> b){
int num1 = a.first, num2 = a.first;
if(num1 > num2)
return true;
else if(num1 == num2)
return a > b;
else
return false;
}
};

int main(){
for(int i = 0; i < 3200; i++)
tab[i] = 0;
tab[0] = tab[1] = 1;
for(int i = 2; i < 3200; i++){
if(!tab[i])
for(int j = i+i; j < 3200; j += i)
tab[j] = 1;
}
int num = 0;
priority_queue<int, vector<pair<int,int> >, MyLess> pq1;
priority_queue<int, vector<pair<int,int> >, MyGreater> pq2;
cin >> num;
while(num--){
int tmp = 0;
for(int t = 0; t < 10; t++){
cin >> tmp;
pq1.push(make_pair(getNum(tmp),tmp));
pq2.push(make_pair(getNum(tmp),tmp));
}
cout << pq1.top().second << " " << pq2.top().second << endl;
pq1.pop();
pq2.pop();
}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息