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;
}
问题重点在实现效率上,主要分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;
}
相关文章推荐
- 动易2006序列号破解算法公布
- C#数据结构与算法揭秘二
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- java数据结构和算法学习之汉诺塔示例
- python计数排序和基数排序算法实例
- python基础教程之python消息摘要算法使用示例
- php的hash算法介绍
- 将15位身份证补全为18位身份证的算法示例详解
- python实现simhash算法实例
- C++算法系列之日历生成的算法代码
- 利用线性表的顺序结构求集合的并、交、差、补(C语言实现)
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度
- 算法导论:选择排序的原理与实现
- PHP实现四种常用的排序算法