# IT aufgabe



## michi.0152 (13. Nov 2009)

hallo wir haben heute in der Schule in Informatik folgende Aufgabe gekriegt die wir mittels Java lösen sollen:



> Die ersten sieben Ziffern sind in der natürlichen Reihenfolge 1,2,3,4,5,6,7 aufgeschrieben. Die Ziffern kann man nebeneinander stellen oder sie mit + oder - zu einem Term verbinden:
> 
> Bsp:1+23-4+56-7=69
> 
> Implementieren sie eine Methode die einen Term berechnet, der den Wert 40 hat



Nun sitze ich ziemlich verzweifelt da und weiß mir nicht zu helfen.

Ich wäre euch für jede Hilfe dankbar!!


----------



## diggaa1984 (13. Nov 2009)

scheint als sollst da wie wild permutieren ^^ eine hässliche Aufgabe wie ich finde

12+34-5+6-7


----------



## ARadauer (13. Nov 2009)

Bitte frag mal einen Lehrer was man da genau lernen soll...

Seltsame Aufgaben würde ich mit seltsamen Lösungen entegegenkommen 


1-2-3+45+6-7 = 40


```
import java.io.IOException;
import java.util.Random;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Rechner {

	public static void main(String[] args) throws IOException, ScriptException {

		
		int[] numbers = {1,2,3,4,5,6,7};

		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		
		Random rnd = new Random();
		
		int ergebnis = 0;
		while(ergebnis!=40){
			StringBuffer formel = new StringBuffer();
			for(int i = 0; i < numbers.length-1; i++){
				formel.append(numbers[i]);
				int zeichen = rnd.nextInt(3);
				switch (zeichen) {
				case 0:
					formel.append('+');
					break;
				case 1:
					formel.append('-');
					break;
				default:
					break;
				}	
				
			}
			formel.append(numbers[numbers.length-1]);
			
			
			
			engine.eval("var v = eval('"+formel.toString()+"')");
			double d =(Double) engine.get("v");
			ergebnis = (int)d;
			System.out.println(formel +" = "+ergebnis);
		}
		
		
		


	}
}
```
btw: das ist sicher keine gute Lösung ;-)


----------



## michi.0152 (13. Nov 2009)

könntest du mir auch verraten welche mathematische Theorie dahinter liegt. Da ich mir sonst nicht erklären kann wie du drauf gekommen bist.


----------



## diggaa1984 (13. Nov 2009)

der ablauf is wie folgt:


```
solange das ergebnis nicht erzielt wurde:
    für alle zahlen aus dem Feld, [COLOR="Red"]ausser der letzten[/COLOR]
        füge aktuelle zahl aus dem feld zur formel hinzu
        ermittle eine zufallszahl von 0-2
        wenn 0 .. dann füge + Operator ein
        wenn 1 .. dann füge - Operator ein
        wenn was anderes .. dann mach nix

    hänge letzte zahl aus dem feld an die formel

    berechne den term (hier hat er getrickst^^)
```

auf deutsch .. er probiert solange bis es passt ^^
Gibt man zufällig eine Zahl an die Größer ist als die Zahl, welche sich durch stumpfes Aneinanderreihen der einzelnen Zahlen ergibt, so hast du eine Endlosschleife^^


----------



## michi.0152 (14. Nov 2009)

ja das habe ich schon raus kriegen können, aber mein Problem ist , das ja der Scriptenginemanager eigentlich die Hauptarbeit macht. und wie du drauf gekommen bist ihn zu verwenden


----------



## diggaa1984 (14. Nov 2009)

die engine rechnet nur den string aus, wenn du das selbst machen möchtest, bedarfs ein wenig mehr arbeit und wissen bezüglich Parsern .. in der FAQ gibts einen Beitrag dazu:
parser-fuer-mathematische-formeln


----------



## Landei (14. Nov 2009)

Mann, warum so umständlich?


```
public class PlusMinus {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(new Integer[]{1,2,3,4,5,6,7});
       plusMinus(list, "", 0, 40);
    }

    private static void plusMinus(List<Integer> list, String path, int sum, int goal) {
        if(list.isEmpty()) {
            if(sum == goal) System.out.println(path);
        } else {
           int number = 0;
           for(int i = 0; i < list.size(); i++) {
               number = 10*number + list.get(i);
               List<Integer> rest = list.subList(i+1, list.size());
               plusMinus(rest, path + "+" + number, sum + number, goal);
               plusMinus(rest, path + "-" + number, sum - number, goal);
           }
        }
    }
}
```


```
+1-2-3+45+6-7
-1-2-3+45-6+7
+12+34-5+6-7
+12-34-5+67
-12+34+5+6+7
```


----------



## michi.0152 (15. Nov 2009)

deine Lösung funktioniert irgendwie nicht. Es gibt mir einen Compilerfehler raus:

List<Integer> cannot found


----------



## eRaaaa (15. Nov 2009)

[c]import java.util.List;[/c]


----------



## diggaa1984 (15. Nov 2009)

Landei hat gesagt.:


> Mann, warum so umständlich?



du machst aber auch nix anderes als alles mögliche zu probieren, nur siehts schöner aus


----------

