# Fakultät zurückrechnen



## kingpin000 (25. Nov 2012)

Hallo,
ich steh im Moment auf dem Schlauch bezüglich einem Problem mit Fakultäten und zwar: Wie ich aus einer Zahl dessen Fakultät berechne, weiß ich, aber ich würde gerne eine Zahl die aus einer Fakultät entstanden ist, wieder auf seinen Ursprungswert zurückrechnen.

Hat da jemand eine Idee?


----------



## nillehammer (25. Nov 2012)

Da es bei Fakultät um Multiplikation geht, muss die Fakultät durch alle Multiplikatoren teilbar sein, die bei ihrer Berechnung beteiligt waren. Rechnet man die Fakultät rückwärts, muss 1.0 raus kommen. Geht das nicht, handelt es sich nicht um eine Fakultät von irgendwas. Das kann man sich zu nutze machen:

```
/**
  * Rechnet die Fakultät rückwärts und versucht, die Zahl
  * zu ermitteln, deren Fakultät als Parameter übergeben wurde.
  * @param factorial die eventuell fakultät
  * @return die zahl, deren Fakultät übergeben wurde, oder -1, wenn die Zahl keine
  *          Fakultät war.
  */
	static int reverseFactorial(final int factorial) {

		double divisionResult = factorial;

		int i = 1;

		do {
			i++;

			System.out.print(divisionResult + ":" + i + "=");

			divisionResult = divisionResult / i;

			System.out.println(divisionResult);

		} while (divisionResult > 1.0);

		return (divisionResult == 1.0) ? i : -1;
	}
```


----------



## Landei (25. Nov 2012)

Wohl besser mit Ganzzahl-Arithmetik und early exit:


```
public static int reverseFactorial(int factorial) {
        int i = 1;
        for(; i <= factorial; i++) {
            if (factorial % i != 0) {
                return - 1;
            }
            factorial /= i;
        }
        return i-1;
    }
```

Wobei man bei den paar Fakultät-Werten, die in [c]int[/c] passen, einfach ein Array mit den Werten ginge.


----------



## kingpin000 (25. Nov 2012)

nillehammer hat gesagt.:


> Da es bei Fakultät um Multiplikation geht, muss die Fakultät durch alle Multiplikatoren teilbar sein, die bei ihrer Berechnung beteiligt waren. Rechnet man die Fakultät rückwärts, muss 1.0 raus kommen. Geht das nicht, handelt es sich nicht um eine Fakultät von irgendwas. Das kann man sich zu nutze machen:
> 
> ```
> /**
> ...



ich hätte da mal eine Frage zur letzten Zeile. Welche Wirkung hat das "?" ?


----------



## trääät (25. Nov 2012)

also auch wenn man jetzt nicht weis dass das ding "ternär-operator" heißt ... so könnte man doch auf folgendes kommen :

das "?" ist ein operator ... und halt nun mal ein "fragezeichen" ...

also könnte man auch von selbst drauf kommen das man google einfach mal nach "java fragezeichen operator" fragt ... wenn man halt wie gesagt nicht weis dass das teil "ternär-operator" heißt ...


----------



## nillehammer (25. Nov 2012)

Landei hat gesagt.:
			
		

> Wohl besser mit Ganzzahl-Arithmetik und early exit:


Dein Code ist besser als meiner :toll:


			
				kingpin000 hat gesagt.:
			
		

> ich hätte da mal eine Frage zur letzten Zeile. Welche Wirkung hat das "?" ?


Das ist -wie schon geschrieben- der Ternäroperator. Er ermöglicht die Auswahl eines der beiden Werte neben dem 
	
	
	
	





```
:
```
  abhängig von dem Ergebnis der Prüfung vor dem Fragezeichen. Es ist im Prinzip ein verkürztes if-else. Hättste aber echt auch selber googeln können


----------



## hüteüberhüte (25. Nov 2012)

ternäre(r) Operator (ternary operator), wenn du googlen willst.


----------



## All4Me (26. Nov 2012)

Ist es von der Performance nicht besser, die Fakultät per Multiplikation zu berechnen und abzubrechen, wenn der Wert gleich oder größer dals der Ausgangswert ist?

Meine Überlegung kommt daher, dass die Muktiplikation schneller als die Division ist.

Sowas in der Art:

```
static int reverseFactorial(final int factorial){
  int i = 1;
  int fac = 1;
  for(;fac<factorial;i++){
    fac *=i;
  }
  if(fac==factorial){
    return i;
  }else{
    return -1;
  }
}
```


----------

