# Fakultät + Overflow



## DrManfred (17. Nov 2013)

Hallo Leute!
Ich habe ein Riesen Problem und komme einfach nicht weiter! Ich hoffe jemand kann mir helfen!

Ich bin ein Java-Anfänger und tue mich damit noch recht schwer!

Hier die Aufgabe:

- wir sollen ein Fakultäts-Programm erstellen, in dem man eine Zahl eingibt und dann die Fakultät berechnet wird
- es soll der Datentyp "int" verwendet werden
- eine geeignete Schleife soll gewählt werde
- bei negativen eingaben soll eine Meldung + entsprechende Aufforderung zur erneuten Eingabe kommen
- beim Overflow-Fall soll eine Meldung kommen
- und es soll eine overflow-flag gesetzt werden

Mein bisheriger Code: 


```
import java.util.Scanner;

class Fakultaet


{
  public static void main (String[] args )
  {


    Scanner scan = new Scanner( System.in );
    long n, fakultaet = 1;

    System.out.println( "Geben Sie eine Zahl ein:" );

    n = scan.nextLong();


    if ( n >= 0 )
    {
      while ( n > 1 )
      {
        fakultaet = fakultaet * n;
        n   = n - 1;
      }
      System.out.println( "Fakultaet = " + fakultaet );
    }
    else
    {
      System.out.println("Keine negativen Zahlen!");

while( n < 0)
{

System.out.println( "Geben Sie erneut eine Zahl ein:" );

    n = scan.nextLong();


    if ( n >= 0 )
    {
      while ( n > 1 )
      {
        fakultaet = fakultaet * n;
        n   = n - 1;
      }
      System.out.println( "Fakultaet = " + fakultaet );
    }
    else
    {
      System.out.println("Keine negativen Zahlen!");
    }
}
  }
}
}
```

Ich kann mit diesem Code eine Zahl eintippen und diese wird als Fakultät ausgegeben. Eine Meldung bei negativen eingegeben Zahlen kommt ebenfalls! Nun ist das Problem, dass eigentlich nur bis 13! korrekte Werte rauskommen sollten und danach ein Overflow erscheinen sollte! Das passiert hier aber nicht! 

Meine Frage also, stimmt der Code so überhaupt? Und wie löse ich das Overflow-Problem, sodass vor jeder eingabe oder Multiplikation geprüft wird, ob ein Overflow zustande kommt oder nicht?

Vielen Dank schonmal im Voraus!


----------



## eMmiE (17. Nov 2013)

Oben ist gesagt worden, dass der Datentyp "int" benutzt werden soll, allerdings steht im Code was von long.

während int Werte von -2,147,483,648 bis 2,147,483,647 aufnehmen kann,
kann long Werte von -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807 aufnehmen

D.h. bei int wäre schon bei , k.a. 13! Schluss, während bei long bis 63! o. 64! möglich ist


----------



## turtle (17. Nov 2013)

Wie eMmiE richtig anmerkte ist der Wertebereich von int-werten überschritten.

Das lässt sich nur testen mit einem Datentyp, der grösser als int (32-bit) ist. Wahrscheinlich hast du desewegen bereits long (64-bit) genommen.

Dann kannst du auch prüfen, ob die Multiplikation die grösst-mögliche Integer-Zahl übersteigt, denn dann hast du einen Overflow.
Icg "mag" lieber for-Schleifen.


```
long fakultaet = 1;
		System.out.println("Geben Sie eine Zahl ein:");

		n = scan.nextInt();

		if (n >= 1) {
			boolean overflow = false;
			for (int i = 1; i <= n; i++) {
				if (fakultaet * i > Integer.MAX_VALUE) {
					overflow = true;
					break;
				}
				fakultaet = fakultaet * i;
			}
			if (overflow) {
				System.out.println("Overflow");
			} else {
				System.out.println("Fakultaet = " + fakultaet);
			}
```


----------

