素数伴侣

来源:互联网 发布:ai软件自学教程 编辑:程序博客网 时间:2024/06/10 03:53

若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。

输入:

有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。

输出:

输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。

一开始除了暴力法没有想到特别好的办法,后来看到了一位网友的说法,得到本题思路。

本题思路:将数组分为奇数组和偶数组,将元素较少的数组全排列依次与另一素组进行运算,得到最终结果

import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main {static int max=0;public static void main(String args[]){Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();List<Integer> odd=new ArrayList<Integer>();List<Integer> simple=new ArrayList<Integer>();int temp;for(int i=0;i<n;i++){temp=scanner.nextInt();if(temp%2!=0)simple.add(temp);elseodd.add(temp);}Integer[] o=new Integer[odd.size()];odd.toArray(o);Integer[] s=new Integer[odd.size()];simple.toArray(s);if(odd.size()>simple.size()){function(s,o,s.length,0);}else{function(o,s,o.length,0);}System.out.println(max);scanner.close();}public static void function(Integer[] o, Integer[] s, int length, int begin) {if(begin==length-1){int temp=0;int count=0;for(int i=0;i<length;i++){temp=o[i]+s[i];if(isPrime(temp))count++;}if(count>max)max=count;}for(int i=begin;i<length;i++){int temp=o[begin];o[begin]=o[i];o[i]=temp;function(o,s,length,begin+1);temp=o[begin];o[begin]=o[i];o[i]=temp;}}public static boolean isPrime(int n) {for(int i=2;i*i<=n;i++){if(n%i==0){return false;}}return true;}}

0 0
原创粉丝点击