华为oj素数伴侣
2016-02-03 18:44
309 查看
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。输入:有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。输出:输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。
对于这个题,我觉得题目的本意应该是使用匈牙利算法 计算最大匹配的问题,因为对于两个数的和为一个素数的话,必然是一个奇数一个偶数的组合,所以可以分为两个集合,来求二分图的最大匹配问题,但是博主当时也没想太多,就用了全排列来讨论所有的可能。这是最直接的想法,下面是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
;
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));
}
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如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 |
#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
;
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++提供了高效全排列算法,在使用这个函数的时候,一定要做排序处理。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- STL区间成员函数及区间算法总结
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析