# Maximale Fakultät kleiner n berechnen



## T-Pain (13. Dez 2013)

Hallo,

ich möchte ein Programm schreiben, welches mir die größtmögliche Fakultät < n ausrechnet.
in anderen worten:

f(n) = max{k >= 1 | k! < n}

Bisher habe ich die Fakultät iterativ mit einer for-Schleife korrekt berechnet:



```
public class faktest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long n = 10;
		long faku = 1;
	
		
		for(int i = 1; i<=n; i++)
        {
            faku *= i;

         if(faku<n)
        	 System.out.println(faku);
        }

	}

}
```



Wie kann ich das denn umschreiben, sodass die Fakultätsberechnung abbricht, sobald das Programm merkt, dass es größer wird als n und optimalerweise das letzte k! ausgibt, welches kleiner als n ist?

Bei mir wirft er ja alle k! in die Runde, aber ich möchte lediglich das größte haben.



Danke für eure Hilfe.


----------



## Gucky (13. Dez 2013)

Teile die Fakultätsberechnung in eine Methode auf, die einen Wert zurückgibt. Wenn die Fakultät nach der Multiplikation größer ist, als n gibst du faku zurück. Ansonsten erst nach der Schleife.


----------



## T-Pain (13. Dez 2013)

wir sollen das ohne methoden machen;(

das was du sagst steht doch schon so in meinem programm drin?
ich erhalte ja das richtige ergebnis, aber ich möchte nur den letzten wert bekommen...


----------



## Gucky (13. Dez 2013)

Ohne Methoden???!!!!!!!!!!! Was ist das denn für ein Lehrer/Prof? Und wie programmiert ihr? Mit Lochkarten?

Füge ein break; ein, wenn das if true ergibt und mach den SysOut hinter die Schleife.


----------



## T-Pain (13. Dez 2013)

Naja, Methoden kommen wohl später. 

Wenn ich ein break einfüge, stoppt die schleife doch schon bei der ersten Berechnung weil wenn zum Beispiel n=4 ist,  ist die erste Berechnung in der Fakultät 2 und somit die of Bedingung erfüllt. Und das wäre dann auch falsch, weil es nicht die größte Fakultät kleiner als n ist...


----------



## Tobse (13. Dez 2013)

Jetz denk mal scharf nach, wie liese sich denn ein 
	
	
	
	





```
break
```
 mit einem 
	
	
	
	





```
if
```
 kombinieren?


----------



## T-Pain (13. Dez 2013)

If (faku>n) break;
System.out.println(faku);

Sorry, bin unterwegs und schreibe mit dem Handy. 
Aber ginge das so?


----------



## Tobse (13. Dez 2013)

Fast. Wenn du das so schreibst, wird die fakultät jeden durchlauf ausgegeben. Wenn du aber machst


```
while (...) {
    // ...
    if (faku > n) break;
}
```
Musst du 
	
	
	
	





```
faku - 1
```
 zurückgeben, weil 
	
	
	
	





```
faku!
```
 ja schon größer als 
	
	
	
	





```
n
```
 ist.


----------



## T-Pain (13. Dez 2013)

Achja, es muss ja dann die Fakultät von einem Durchgang davor berechnet werden. 
Danke für deine Hilfe!


----------

