# Schleifen Beispiel: Fakultät



## Zarathustra (22. Sep 2014)

Beispiel:
Die Fakultät (geschrieben n!) einer Zahl n berechnet sich als n!=123(n-1)n. Schreiben Sie ein Programm das die Fakultät einer eingegebenen Zahl berechnet.


Wie lös ich das am Besten? Muss mit einer Schleife sein!

Danke schon mal im voraus!


Greez


----------



## nvidia (22. Sep 2014)

Fast Factorial Functions


----------



## Joose (22. Sep 2014)

Es gibt einen eigenen Bereich für Hausgaben,
sollte es doch keine Hausaufgabe sein -> stelle deine Frage genauer! Was verstehst du nicht, wo hängst du?
Zeige deinen bisherigen Code.


----------



## Thallius (22. Sep 2014)

Joose hat gesagt.:


> Es gibt einen eigenen Bereich für Hausgaben,
> sollte es doch keine Hausaufgabe sein -> stelle deine Frage genauer! Was verstehst du nicht, wo hängst du?
> Zeige deinen bisherigen Code.



Zu spät er hat ja schon die Lösung zum Copy&Paste.

Gruß

Claus


----------



## Joose (22. Sep 2014)

Thallius hat gesagt.:


> Zu spät er hat ja schon die Lösung zum Copy&Paste.



Bleibt aber die Frage ob er die entsprechende Seite genau liest und es auch richtig kopiert


----------



## Zarathustra (22. Sep 2014)

Hallo an alle!

Wow, das ging schnell!

Wie ihr vielleicht sehen konntet war dies mein erster Beitrag, sprich ich hab leider nicht gesehen, dass es einen eigenen HÜ Ordner gibt - sorry!

Zweitens: Kopieren tu ich keine Codes. Bin noch ein Anfäger und versuche selbst auf die Lösung zu kommen d.h. ich schau mir die Codes an, versuche sie zu verstehen und versuch es anschließend selbst. Teilweise tipp ich sie auch ab was meiner Meinung noch immer besser ist als kopieren und fertig. 

Wo man auch schon beim Problem sind. Mit der ersten Lösung kann ich leider nichts anfangen - sorry... Liegt bestimmt daran, dass ich noch Anfänger bin... 

Genauere Angeben zur Aufgabenstellung hab ich leider auch nicht. Hab dies 1:1 von von dem Mail, welches ich vom Prof. bekommen hab, kopiert!


----------



## Joose (22. Sep 2014)

Entweder habt ihr in Mathe schon die Fakultät durchgenommen und du weißt wie man die Fakultät einer Zahl X berechnet, oder
du musst deinen Professer darauf aufmerksam machen, dass ihr die Fakultät noch nicht berechnen könnt und er auch entsprechende Möglichkeiten geben muss dies zu lernen oder ähnliches.

Ansonsten gibt es auf Wikipedia eine super Erklärung zur Fakultät. Schau dort einfach mal nach, eine allgemeine Formel findet man da auch. Diese musst du dann nur noch in dein Programm übertragen.


----------



## JavaMeister (22. Sep 2014)

Ok. Dein posting ist lang. Aber mehr relevante Infos als dein Ausgangspost liefert er auch nicht. 

Schau dir mal unsere Rückfragen an.


----------



## Zarathustra (23. Sep 2014)

Bzgl Code: 

Ich weiß einfach nicht wie ich angfangen soll. Was Fakultät bedeutet usw. ist mir natürlich klar. 
Mein Hauptproblem ist, wie ich dazu komme, dass es dem Programm egal ist, ob eine Zahl mit ziffern eingegeben wird oder eine mit 5 Ziffern...

Mein Anfang sieht wie folgt aus:


```
package fakultaet;

import java.util.Scanner;

public class Fakultaet 
{

    public static void main(String[] args) 
    {
        Scanner scan = new Scanner ( System.in );
        
        long z;
        
        System.out.println( "Bitte geben Sie eine Zahl ein!" );
        z = scan.nextLong();
        
        
    }
    
}
```


----------



## Joose (23. Sep 2014)

Wie gesagt auf Wikipedia gibt es eine gute Erklärung der Fakultät. Dort findet sich auch der Sourcecode zur Berechnung der Fakultät geschrieben mit Phyton. 

Dein Anfang passt schon mal ... aber du liest ja nur eine Zahl ein. Wenn du mehr hast kannst dich ja wieder melden.


----------



## Zarathustra (24. Sep 2014)

Hello, 

hab es gestern Nacht endlich geschafft:

[Java]

package teilbardurchsieben;

import java.util.Scanner;

public class TeilbarDurchSieben 
{

    public static void main(String[] args) 
    {
        Scanner scan = new Scanner (System.in );

        int i;
        int zahl1;
        System.out.println( "Bitte geben Sie die erste Zahl ein!" );
        zahl1=scan.nextInt();

        int zahl2;
        System.out.println( "Bitte geben Sie die zweite Zahl ein!");
        zahl2=scan.nextInt();

        for ( i=zahl1; i <= zahl2; i++ )
          if ( i%7 == 0 )
              System.out.println( "Die Zahl " + i + " ist durch sieben teilbar!");
    }  
}
[/Java]

Hätte ich was besser machen können, oder passt das Programm im Großen und Ganzen?!
Danke nochmal an alle!!

LG


----------



## Joose (24. Sep 2014)

Dein Programm berechnet aber nicht die Fakultät, das weißt du schon oder?


----------



## Zarathustra (24. Sep 2014)

Oh man, das war ein anderes Programm, was ich geübt hab. Sorry...

Hier ist nochmal das richtige:

[Java]
package fakultaet;

import java.util.Scanner;

public class Fakultaet 
{

    public static void main(String[] args) 
    {
        Scanner scan = new Scanner ( System.in );
        long z, faku = 1;

        System.out.println( "Bitte geben Sie eine Zahl ein!" );
        z = scan.nextLong();

        if ( z >= 0 )
                {
                    while ( z > 1 )
                    {
                        faku = faku * z;
                        z = z - 1;
                    }
                    System.out.println( "Die Fakultät der eingebenen Zahl lautet " + faku );
                }
        else
        {
            System.out.println( "Eingegebene Zahl muss 0 od. größer sein!" );
        }
    }  
}
[/code]


----------



## Ice (24. Sep 2014)

int fac = 0;
		int result = 1;   // eine Fakultät ist immer >= 1 , also ist Result minimum1
		while(fac != 0)
		{
			if(fac == 0) result = 1;  // 0! = 1
			else {
                        result *= fac;   
			fac--;  
                    }
                  }


Machs dir nicht so kompliziert, mein Junge

Ice


----------



## Joose (24. Sep 2014)

Ice hat gesagt.:


> Machs dir nicht so kompliziert, mein Junge



1. Für seinen Wissensstand was Java betrifft passt sein Code schon
2. Deinen Code könntest du ruhig in Java-Tags geben -> machs uns nicht so schwer den Code zu lesen!
3. So wie dein Code hier steht passiert genau nichts. Wenigstens ein weitere Kommentar zu "int fac = 0;" wäre notwendig


----------



## Thallius (24. Sep 2014)

Ice hat gesagt.:


> int fac = 0;
> int result = 1;   // eine Fakultät ist immer >= 1 , also ist Result minimum1
> while(fac != 0)
> {
> ...



Also der Code geht noch kürzer:


```
Int fac=0
```

Mehr macht der nämlich nicht.

Gruss

Claus


----------



## Ice (24. Sep 2014)

Da ihr anscheinend probleme habt diesen Code zu verstehen, versucht doch mal fac auf ne beliebige Zahl zu verändern


----------



## Thallius (24. Sep 2014)

Ice hat gesagt.:


> Da ihr anscheinend probleme habt diesen Code zu verstehen, versucht doch mal fac auf ne beliebige Zahl zu verändern



Selbst dann ist dein code Quatsch. Was soll die if abfrage innerhalb der Schleife? Diese kann niemals true sein


----------



## Joose (24. Sep 2014)

Ice hat gesagt.:


> Da ihr anscheinend probleme habt diesen Code zu verstehen



Den habe ich schon verstanden auch wenn er schwer zu lesen ist wenn er nicht in Java-Tags steht



Ice hat gesagt.:


> , versucht doch mal fac auf ne beliebige Zahl zu verändern



Ich habe ja gesagt ein weiteres Kommentar bei der Zeile wo du "fac" deklarierst und initialisierst wäre nicht falsch gewesen.
Dann wäre das sofort klar das anstatt direkt eine Zahl als Startwert festzulegen diese auch von der Konsole oder so einlesen könnte


----------



## Ice (24. Sep 2014)

Thallius hat gesagt.:


> Selbst dann ist dein code Quatsch. Was soll die if abfrage innerhalb der Schleife? Diese kann niemals true sein



Was ist los mit dir, der code ist richtig. Du kannst fac per scanner als userinput einlesen und wenn der benutzer 0 als fac ausgerechnet haben will dann  wird die if Bedingung erfüllt, das einzige was fehlt ist die Überprüfung auf positive zahlen


----------



## Joose (24. Sep 2014)

Ice hat gesagt.:


> Was ist los mit dir, der code ist richtig. Du kannst fac per scanner als userinput einlesen



Das als Kommentar in der Zeile wäre schon praktisch für Anfänger.



Ice hat gesagt.:


> und wenn der benutzer 0 als fac ausgerechnet haben will dann  wird die if Bedingung erfüllt, das einzige was fehlt ist die Überprüfung auf positive zahlen



Ja theoretisch schon. Nur kommt man dann nicht einmal in die while-Schleife da "fac" 0 ist und somit nicht != 0 sein kann 
Somit ist diese if unnötig.


----------



## Ice (24. Sep 2014)

Joose hat gesagt.:


> Das als Kommentar in der Zeile wäre schon praktisch für Anfänger.
> 
> 
> 
> ...



Oh stimmt  wenn ich zu hause bin änder ich es um


----------



## Ice (24. Sep 2014)

int fac = 0;  // Startwert, ggf. als UserInput verlangen
		int result = 1;  // n-Fakultät ist immer >= 1
		do 
		{
		if(fac == 0) break; // 0! = 1
		else {
		result *= fac; 
		fac--; 
		}
		} while(fac != 0);
 System.out.println(result);
	}


----------



## JavaMeister (24. Sep 2014)

Gibt es keine java tags mehr?

Und diese hartnäckige if abfrage ist sinnlos und kann weg.


----------



## Joose (24. Sep 2014)

JavaMeister hat gesagt.:


> Und diese hartnäckige if abfrage ist sinnlos und kann weg.



Achtung bei seiner Variante mit der "while" Schleife ist die if-Abfrage wirklich unnötig.
Bei dieser Variante mit der "do-while" Schleife muss sie drinnen sein.
Natürlich ist die Version mit der "while"-Schleife der anderen vorzuziehen.


----------



## JavaMeister (24. Sep 2014)

Präzise.


----------



## Thallius (24. Sep 2014)

Um es einmal richtig zu schreiben wie man es optimiert. Wobei ich die Version des TO vollkommen in Ordnung finde.


```
int zahl = 6; // hier bitte die Zahl zuweisen deren Fakultät errechnet werden soll.
if (zahl <= 1) return 1;
int ergebnis = 1;
while(zahl > 1) ergebnis *= zahl--;
return ergebnis;
```

Gruss

Claus


----------

