zoukankan      html  css  js  c++  java
  • Prime Solutions

    Prime Solutions
    以下是一段中学时代的惨痛回忆…每当学到排列组合的单元时,最痛苦的不是分析题目,也不是带错公式或计算错误,而是所谓的「苦工题」,以下这题是个例子:
    给定正整数N与S,求出方程式(1)的所有质数解(全为质数)。

    遇到这题,通常只能硬着头皮将每一组以「土法炼钢」的方式一一列出,然而到了大学修过程式设计与演算法课,俾使我们能在电脑上撰写程式轻松解决此问题。

    INPUT
    第一行一样为测资个数
    每一行输入正整数与正整数,N与S之间相隔一个空白键。
    (提示: 计算之前先考虑方程式有没有解可以加速程式执行。)

    OUTPUT
    N个质数相加刚好等於S有哪些可能的组合,质数可以重复,但请由小到大排列,若无解(例如100个质数相加等於23无解)则输出0,解可能不只一组,若有多组解时,靠左边的数字较小的那组解则优先输出,请参照SAMPLE OUTPUT。每一笔测资的输出之间也换一行。

    SAMPLE INPUT
    4
    2 5
    100 23
    3 8
    4 25

    SAMPLE OUTPUT
    2 3

    0

    2 3 3

    2 2 2 19
    2 3 3 17
    2 3 7 13
    2 5 5 13
    2 5 7 11


    答案

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Scanner;
    import java.util.Stack;
    
    public class Prime {
    static List<Integer> primeList = new ArrayList<Integer>();
    
    static List<Integer> starttList = new ArrayList<Integer>();
    static List<Integer[]> engtList = new ArrayList<Integer[]>();
    
    static Integer[] iArr ;
    static boolean flage;
    
        //static int a;
         static int size;
        
        
        static  Stack<Integer> stack = new Stack<Integer>();
        
        static Stack<Integer> stackResult = new Stack<Integer>();
         public static void main(String[] args) {
             Scanner scan = new Scanner(System.in);
             int z = scan.nextInt();
             while(z>0){
                flage = false;
                stack.clear();
                stackResult.clear();
                iArr =null;
                primeList =new ArrayList<Integer>();
                  engtList = new ArrayList<Integer[]>();
                
    //              System.out.println("请输入您要结果的size:");
                   
                 size = scan.nextInt();
                
           //   System.out.println("请输入您要结果数为:");
                int num = scan.nextInt();
            
    
                for(int i=2;i<=num;i++){
                    if(isPrime(i)){
                       primeList.add(i);
                    }
                }
                
                iArr = primeList.toArray(new Integer[0]);
                sort(iArr);
           
         Calc(num, iArr);
         int j=0;
                if(!flage){
                    System.out.println(j);
                }
                 z--;
                 
                 
                 Comparator<Integer[]> comparator = new Comparator<Integer[]>() {
                        public int compare(Integer[] s1, Integer[] s2) {
                            for(int i=0;i<s1.length;i++){
                                if(s1[i]!=s2[i]){
                                    return s1[i]-s2[i];
                                }
                            }
                            return 1;
                     
                        }
                    };
                    
                    //这里就会自动根据规则进行排序
                    Collections.sort(engtList,comparator);
                    for(int i=0;i<engtList.size();i++){
                        Integer[] stu=engtList.get(i);
                        for(int ii:stu){
                            System.out.print(ii+" ");
                        }
                        System.out.println();
                    }
                    if(z>0){
                         System.out.println();
                    }
                   
             }
       
      }
    
    
    private static void Calc(int a,Integer[] iArr)
    {
        for (int i = 0; i < iArr.length; i++)
        {
            if (iArr[i] == a && size==1)
            {
                //输出这个数
                System.out.println(iArr[i]);
                flage=true;
                continue;
            }
    //        else if (iArr[i] > a)
    //        {
    //            continue;
    //        }
               if (iArr[i] > a)
                    {
                        continue;
                    }
            stack.clear();
            stack.push(iArr[i]);
            Func(i, a - iArr[i]);
        }
    }
    
    
    private static  void Func(int i, int iValue)
    {
        for (int j = i ; j < iArr.length; j++)
        {
            if (iArr[j] > iValue)
            {
                continue;
            }
            else if (iValue == iArr[j])
            {
                stack.push(iArr[j]);
                //输出stack 这一步略..
                if(stack.size()==size){
                     iteratorThroughIterator(stack);
                
                }
               stack.pop();
            }
            else if (iValue > iArr[j])
            {
                
                stack.push(iArr[j]);
                Func(j, iValue - iArr[j]);
                stack.pop();
            }
        }
    }
    
     
    /**
     * 通过迭代器遍历Stack 
     */
    public static void iteratorThroughIterator(List list) {
    
        Integer val = null;
        for(Iterator iter = list.iterator(); iter.hasNext(); ) {
            val = (Integer) iter.next();
            stackResult.push(val);
          //  System.out.print(val+" ");
        }
    //    System.out.println();
        playResult(stackResult);
        stackResult.clear();
    }
    
    /**
     * 通过迭代器遍历Stack
     */
    public static void playResult(Stack stack) {
        flage = true;
        while(!stack.empty()){
            
            starttList.add((Integer) stack.pop());
        }
        Integer[] a= starttList.toArray(new Integer[0]);
        starttList.clear();
        engtList.add(a.clone());
        a=null;
       
        
    //    System.out.println();
    
    }
    
    public static boolean isPrime(int num){
    
        for (int i = 2; i < num; i++) {//运行效率不高
            if ((num % i) == 0) {
                
                return false;
            }
        }
        return true;
    }
    public static void sort(Integer[] iArr){ for (int i = 0; i < iArr.length -1; i++){ for(int j = 0 ;j < iArr.length - i - 1; j++){ if(iArr[j] < iArr[j + 1]){ int temp = iArr[j]; iArr[j] = iArr[j + 1]; iArr[j + 1] = temp; } } } } }
  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/bmbi/p/5281553.html
Copyright © 2011-2022 走看看