POJ-priority queue練習題:比較質因數個數

題目描述:




問題重點在實現效率上,主要分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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章