# Zahlenrätsel programmieren



## vince191 (29. Mai 2016)

Hallo zusammen, ich bin neu hier und auch neu in der Java Programmierung.

Ich muss folgende Aufgabe lösen und komme überhaupt nicht weiter, vielleicht kann mir jmd weiterhelfen...

*Schreiben Sie ein Programm, das das folgende Symbolrätsel löst, indem alle Ziffernkombinationen durchprobiert und alle gültigen Kombinationen ausgegeben werden.
       H E S
    + T H E
    -------
    B E S T
*
Dabei soll folgendes beachtet werden:

*Es ist nicht zulässig, dass zwei verschiedene Buchstaben für die gleiche Zahl stehen.*

*Schreiben Sie Ihr Programm zunächst so, dass es keine führende Null gibt, d.h. H, T und B müssen ungleich Null sein. Wieviel Lösungen gibt es?*

Hier ist mein Quellcode das ich bis jetzt geschrieben habe, nur wenn ich es ausführe, kommen sehr viele unterschiedliche Ergebnisse, da ist bestimmt noch ein Fehler den ich nicht finden kann.


```
public class ZahlenRaetsel
{
    public static void main(String args[])
    {
        int h,e,s,t,b;
        for (h = 1; h <= 9; h++ )
        {
            for (e = 0 ; e <= 9; e++)
            {
                 for (s = 0; s <=  9; s++)
                 {
                    for (t = 1 ; t <= 9; t++)
                    {
                        for (b = 1; b <= 9; b++)
                        {
                                if (h != e && h != s && h != t && h != b &&
                                    e != s && e != t && e != b &&
                                    s != t && s != b &&
                                    t != b)
                                    
                            {
                                int hes = 100 * h + 10 * e + s;
                                int the = 100 * t + 10 * h + e;
                                int best = 1000* b + 100 * e + 10 * s + t;
                                System.out.println(best);
                            }       

                                                                  
                        }
                    }
                }
            }
        }
    }
}
```

Danke im Voraus :-D


----------



## AndiE (29. Mai 2016)

Die Idee an sich ist OK. Aber du muss tesn, für welche  fünf Zahlen, die vorgegebene Gleichung stimmt. Und nur die brauchst du ausgeben.


----------



## Kenta1561 (29. Mai 2016)

Du musst überprüfen, ob das Ergebnis mit der zusammengesetzen Zahl übereinstimmt, siehe Code:


```
public class ZahlenRaetsel
{
    public static void main(String args[])
    {
        int h,e,s,t,b;
        for (h = 1; h <= 9; h++ )
        {
            for (e = 0 ; e <= 9; e++)
            {
                for (s = 0; s <= 9; s++)
                {
                    for (t = 1 ; t <= 9; t++)
                    {
                        for (b = 1; b <= 9; b++)
                        {
                            if (h != e && h != s && h != t && h != b &&
                                    e != s && e != t && e != b &&
                                    s != t && s != b &&
                                    t != b)

                            {
                                int hes = 100 * h + 10 * e + s;
                                int the = 100 * t + 10 * h + e;
                                int best = 1000* b + 100 * e + 10 * s + t;
                                //Du musst überprüfen, ob das Ergebnis mit der       zusammengesetzen Zahl übereinstimmt
                                int test = hes + the;
                                if(best == test) {
                                    System.out.println(best);
                                }
                            }


                        }
                    }
                }
            }
        }
    }
}
```


----------



## Kenta1561 (29. Mai 2016)

@AndiE Welche fünf Zahlen?


----------



## Blender3D (30. Mai 2016)

Es kommen 5 Ziffern vor:
1. H
2. E
3. S
4. T
5. B


----------



## vince191 (31. Mai 2016)

Hallöchen zusammen,

ich habe habe nun nach Kensta1561 beispiel mein Code vervollständigt...
nun bekomme ich als Ergebnis 1268.


```
public class ZahlenRaetsel
{
    public static void main(String args[])
    {
        int h,e,s,t,b;
        for (h = 1; h <= 9; h++ )
        {
            for (e = 0 ; e <= 9; e++)
            {
                 for (s = 0; s <=  9; s++)
                 {
                    for (t = 1 ; t <= 9; t++)
                    {
                        for (b = 1; b <= 9; b++)
                        {
                                if (h != e && h != s && h != t && h != b &&
                                    e != s && e != t && e != b &&
                                    s != t && s != b &&
                                    t != b)
                                    
                            {
                                int hes = 100 * h + 10 * e + s;
                                int the = 100 * t + 10 * h + e;
                                int best = 1000* b + 100 * e + 10 * s + t;
                                int test = hes + the;
                                if (hes + the == best)
                              
                                System.out.println(best);
                          
                            }       

                                                                  
                      }
                    }
                }
            }
        }
    }
}
```


Ich denke das ist nun richtig so.

Was denkt ihr?





Kenta1561 hat gesagt.:


> Du musst überprüfen, ob das Ergebnis mit der zusammengesetzen Zahl übereinstimmt, siehe Code:
> 
> 
> ```
> ...


----------



## Xyz1 (31. Mai 2016)

Was spricht denn gegen sowas:

```
int b, e, h, s, t;
        for (b = 1; b < 10; b++) {
            for (e = 0; e < 10; e++) {
                for (h = 1; h < 10; h++) {
                    for (s = 0; s < 10; s++) {
                        for (t = 1; t < 10; t++) {
                            if (       b != e
                                    && b != h
                                    && b != s
                                    && b != t
                                    && e != h
                                    && e != s
                                    && e != t
                                    && h != s
                                    && h != t
                                    && s != t) {
                                int hes = h * 100 + e * 10 + s;
                                int the = t * 100 + h * 10 + e;
                                int best = b * 1000 + e * 100 + s * 10 + t;
                                if (hes + the == best) {
                                    System.out.println("hab 'ne Lösung:");
                                    System.out.println(" hes =  " + hes);
                                    System.out.println(" the =  " + the);
                                    System.out.println("best = " + best);
                                    System.out.println("b = " + b);
                                    System.out.println("e = " + e);
                                    System.out.println("h = " + h);
                                    System.out.println("s = " + s);
                                    System.out.println("t = " + t);
                                    return;
                                }
                            }
                        }
                    }
                }
            }
        }
```


```
hab 'ne Lösung:
 hes =  426
 the =  842
best = 1268
b = 1
e = 2
h = 4
s = 6
t = 8
```

Zumindest, wenn alle Variablen paarweise verschieden sind, gibt es genau 1 Lösung.

(Btw.: Über Reflection, ich habs versucht, bekommt man keine Informationen über lokale Variablen: http://stackoverflow.com/questions/...out-the-local-variables-using-java-reflection - ein gänzlich anderer Ansatz wäre ratsam.)


----------



## JStein52 (31. Mai 2016)

DerWissende hat gesagt.:


> Btw.: Über Reflection, ich habs versucht, bekommt man keine Informationen über lokale Variablen: http://stackoverflow.com/questions/...out-the-local-variables-using-java-reflection - ein gänzlich anderer Ansatz wäre ratsam


Entschuldige wenn ich das frage: was spielt das hier für eine Rolle ?  Oder wolltest du einfach mal darüber reden ?


----------



## Xyz1 (31. Mai 2016)

JStein52 hat gesagt.:


> Entschuldige wenn ich das frage: was spielt das hier für eine Rolle ?  Oder wolltest du einfach mal darüber reden ?



Das Spielt insofern eine Rolle, als dass ich sich das for-Geraffel hätte sparen können - als Semi-Professioneller sollte man das eigentlich wissen ... UND weil ich ja faul bin.


----------



## AndiE (31. Mai 2016)

Es macht zwar heutzutage nicht viel Sinn. Ich habe ausgerechnet, dass etwa die Hälfte der Kombinationen Doppelungen aufweist. Gibt es einen Algorithmus, nur gültige Zahlenkombinationen zu testen, also welche, in denen es keine gleichen Zahlen gibt(12345,12354,12435 usw.)?


----------



## Xyz1 (31. Mai 2016)

Joa, den gibt es, hab ich mal in C geschrieben (weil ja ganz schnell sein muss), macht aber von der Geschwindigkeitsperformance keinen Unterschied.
Btw.:
12345,12354,12435 das sind Permutationen
123, 124, 125, 132 usw. das sind Combinations without repetition
Zuerst muss dir klar sein, was du möchtest/willst.


----------



## vince191 (1. Jun 2016)

Hallo nochmal,

da ich noch am anfang bin und dieses reflection noch nicht durchgenommen habe, kann ich es auch in dem Fall nicht anwenden. Ich kann nur den gelernten Stoff anwenden


----------



## Xyz1 (1. Jun 2016)

@AndiE: Bitte nochmal Stoff aus dem 1. Semester wiederholen, für deine Frage (Hint: Kombinatorik).

@vince191: Das wissen wir. Ich habe dir, nach deinen Vorgaben, eine Vorlage deinen Kenntnisstand adäquat geliefert.

@JStein52: Bist du mir jetzt Bös, weil ich Semi-Professioneller geschrieben habe??


----------



## vince191 (1. Jun 2016)

@DerWissende danke nochmal, habe die Aufgabe gestern noch abgegeben... warte nun auf das Ergebnis


----------



## JStein52 (1. Jun 2016)

DerWissende hat gesagt.:


> Bist du mir jetzt Bös, weil ich Semi-Professioneller geschrieben habe??


Ich bin dir natürlich nicht böse. Von semi-professionell fühle ich mich nicht angesprochen. Ich bin schliesslich ein Professioneller.  Deine Beiträge sind manchmal ein bisschen verwirrend


----------



## Xyz1 (1. Jun 2016)

vince191 hat gesagt.:


> @DerWissende danke nochmal, habe die Aufgabe gestern noch abgegeben... warte nun auf das Ergebnis



Hoffentlich, sieht der entsprechende Korrektor das nicht, sonst bekomm' ich noch den Ärger.... Das wäre ja ärgerlich. 

(Edit, quatsch, ich hab lediglich geholfen und eine Stelle geändert.)


----------



## vince191 (3. Jun 2016)

Hi nochmal....

kann mir jmd noch einen kleinen Tipp geben  wenn ich meinen code so umschreiben will, so dass er drarauf achteten das h und/oder t = 0 sind und mit diese ergebnisse anzeigen muss?


----------

