Advertisement
Guest User

Example for GF.net question

a guest
Dec 5th, 2021
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.40 KB | None | 0 0
  1. import java.util.*;
  2. public class Kombinationsfinder {
  3.     static void print(String s) {
  4.         System.out.println(s);
  5.     }
  6.     static List<Integer> listSort(List<Integer> summanden) {
  7.         Collections.sort(summanden);
  8.         Collections.reverse(summanden);
  9.         return summanden;
  10.     }
  11.     static String addToOutputString(String s, int count, int token, String add) {
  12.         if (count>1)
  13.             s+=(""+count+" * "+token+""+add);
  14.         else
  15.             s+=(""+token+""+add);
  16.         return s;
  17.     }
  18.     static String listToString(List<Integer> liste) {
  19.         String s = "";
  20.         for (Integer v : liste) {
  21.             if (liste.indexOf(v)==liste.size()-1)
  22.                 s+=(String.valueOf(v)+"");
  23.             else
  24.                 s+=(String.valueOf(v)+", ");
  25.         }
  26.         return s;
  27.     }
  28.     static String listToShortString(List<Integer> liste) {
  29.         String s = "";
  30.         int count = 0;
  31.         int token = 0;
  32.         int curtok = 0;
  33.         for (int i=0; i<liste.size(); i++) {
  34.             curtok = liste.get(i);
  35.             if (token == 0)
  36.                 token = curtok;
  37.             if (curtok == token) {
  38.                 count++;
  39.             } else {
  40.                 s=addToOutputString(s,count,token," + ");
  41.                 count=1;
  42.                 token=curtok;
  43.             }
  44.         }
  45.         s=addToOutputString(s,count,token,"");
  46.         return s;
  47.     }
  48.     static int listSum(List<Integer> liste) {
  49.         int summe = 0;
  50.         for (Integer v : liste)
  51.             summe+=v;
  52.         return summe;
  53.     }
  54.     static List<Integer> standardValues() {
  55.         List<Integer> l = new ArrayList<Integer>();
  56.         l.add(3);
  57.         l.add(2);
  58.         return l;
  59.     }
  60.     static int findCurrentPointer(List<Integer> s, int v) {
  61.         return (s.indexOf(v)+1);
  62.     }
  63.     public static void main(String args[]) {
  64.         int  summe = 0;
  65.         List<Integer> summanden = new ArrayList<Integer>();
  66.         int magicnumber = 99;
  67.         try {
  68.             if (args.length<3) {
  69.                 print("Zu wenig Parameter (mindestens 3)! Übernehme Standardauswahl:");
  70.                 summanden=standardValues();
  71.                 print("" + magicnumber + ", " + listToString(summanden));
  72.                 print("--------------------------------");
  73.             } else if(args.length>101) {
  74.                 print("Zu viele Parameter! 100 Summanden maximal! Übernehme Standardauswahl:");
  75.                 summanden=standardValues();
  76.                 print("" + magicnumber + ", " + listToString(summanden));
  77.                 print("--------------------------------");
  78.             }  else {
  79.                 magicnumber = Integer.parseInt(args[0]);
  80.                 for (int i=1; i<args.length; i++) {
  81.                     summanden.add(Integer.parseInt(args[i]));
  82.                 }
  83.                 print("Finde alle Kombinationen der Werte: ");
  84.                 print("" + magicnumber + ", " + listToString(summanden));
  85.                 print("--------------------------------");
  86.             }              
  87.         } catch (Exception e) {
  88.             print("Parameter fehlerhaft! Nur ints sind erlaubt!");
  89.             print("Die erste Zahl ist gesucht, die max 100 Zahlen dahinter stellen die erlaubten Glieder dar.");
  90.             print("BeispieL: \"99 3 2\" als Parameter ermittelt alle Kombinationen von 99 mit den beiden Zahlen 2 und 3!");
  91.             print("--------------------------------------------------------------");
  92.             print("Übernehme Standardauswahl:");
  93.             summanden=standardValues();
  94.             print("" + magicnumber + ", " + listToString(summanden));
  95.         }
  96.         summanden = listSort(summanden);
  97.         Boolean all_solutions = false;
  98.         int loopcounter = 0;
  99.         int loopmax = 1000000;
  100.         int pointer = 0;
  101.         int combicount = 0;
  102.         int lowest = summanden.get(summanden.size()-1);
  103.         List<Integer> liste = new ArrayList<Integer>();
  104.         while (all_solutions==false && loopcounter<loopmax) {
  105.             summe = listSum(liste);
  106.             if (summe>=magicnumber) {
  107.                 if (summe == magicnumber) {
  108.                     print("" + listToShortString(liste) + " = " + magicnumber + " !!!");
  109.                     combicount++;
  110.                 }
  111.                 if (liste.get(0) == lowest) {
  112.                     print("--------------------------------\nAlle " + combicount + " Kombinationen in "+loopcounter+" Durchläufen gefunden!");
  113.                     all_solutions=true;
  114.                     break;
  115.                 }
  116.                 if (liste.get(liste.size()-1) > lowest) {
  117.                     liste.remove(liste.size()-1);
  118.                     pointer++;
  119.                 } else {
  120.                     for(int i=liste.size()-1; i>=0; i--) {
  121.                         if (liste.get(i) <= lowest)
  122.                             liste.remove(i);
  123.                         else
  124.                             break;
  125.                     }
  126.                     pointer = findCurrentPointer(summanden, liste.get(liste.size()-1));
  127.                     liste.remove(liste.get(liste.size()-1));
  128.                 }
  129.             } else {
  130.                 liste.add(summanden.get(pointer));
  131.             }
  132.             loopcounter++;
  133.         }
  134.         if(loopcounter == loopmax)
  135.             print("--------------------------------\n"+loopcounter+" Durchläufe berechnet. "+ combicount + " Kombinationen gefunden.");
  136.     }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement