1. 程式人生 > >華為oj素數伴侶

華為oj素數伴侶

題目描述
若兩個正整數的和為素數,則這兩個正整數稱之為“素數伴侶”,如2和5、6和13,它們能應用於通訊加密。現在密碼學會請你設計一個程式,從已有的N(N為偶數)個正整數中挑選出若干對組成“素數伴侶”,挑選方案多種多樣,例如有4個正整數:2,5,6,13,如果將5和6分為一組中只能得到一組“素數伴侶”,而將2和5、6和13編組將得到兩組“素數伴侶”,能組成“素數伴侶”最多的方案稱為“最佳方案”,當然密碼學會希望你尋找出“最佳方案”。

輸入:

有一個正偶數N(N≤100),表示待挑選的自然數的個數。後面給出具體的數字,範圍為[2,30000]。

輸出:

輸出一個整數K,表示你求得的“最佳方案”組成“素數伴侶”的對數。

輸入

輸入說明
1 輸入一個正偶數n
2 輸入n個整數

輸出

求得的“最佳方案”組成“素數伴侶”的對數。

樣例輸入 4 2 5 6 13
樣例輸出 2

對於這個題,我覺得題目的本意應該是使用匈牙利演算法 計算最大匹配的問題,因為對於兩個數的和為一個素數的話,必然是一個奇數一個偶數的組合,所以可以分為兩個集合,來求二分圖的最大匹配問題,但是博主當時也沒想太多,就用了全排列來討論所有的可能。這是最直接的想法,下面是c++實現的素數伴侶的程式碼

#include <iostream>
#include <algorithm>

using namespace std;
int maxx = 0;
int main(){
	bool sushu(int x,int y);
	void permutation(int* str,int length) ;

	int n;
	cin >> n;
	int * pi = new int[n];
	for (int i = 0; i < n;i++)
		cin >> pi[i];

	permutation(pi,n);
	cout << maxx << endl;
	return 0;
}

bool sushu(int x,int y){
	int i,N;
	N = x + y;
	int flag=true;
	if (N==1) return 0;
	if (N==2) return 1;
	for (i=2;i<=sqrt(N);i++){
		if (N%i==0) 
		{
			flag=false;
			break;
		}
	}
	return flag;
}
void permutation(int* str,int length)  
{  
	int count = 0;
    sort(str,str+length);  
    do  
    {  
		for(int i=0;i<length;i+=2)  {
			if (sushu(str[i],str[i+1]))
				count++;
		}
		if (maxx < count)
			maxx = count;
		count = 0;
    }while(next_permutation(str,str+length));  
}  
next_permutation()函式是c++提供了高效全排列演算法,在使用這個函式的時候,一定要做排序處理。