Java frage?
(3.)Schreiben Sie eine Anwendung, welche die Fakultät von 1…5 berechnet und in einer Tabelle ausgibt!:
1! =1 =1
2! =1*2 =2
3! =1*2*3 =6
4! =1*2*3*4 =24
5! =1*2*3*4*5 =120
Verallgemeinern Sie wiederum für beliebige n!
das ist meine aufgabe, ich bekomm sie nicht hin
das habe ich bis jetzt:
public class MyClass {
public static void main(String args[]) {
Integer n = 5;
Integer x = 1;
Integer i = 1;
Integer s = 1;
String o = "*";
System.out.println(i + "!" + " =" + x + " =" + i);
while (x < n) {
x = x + 1;
i = i * x;
System.out.println(x + "!" + " =" + s + "*" + n + " =" + i);
s = s + 1;
}
}
}
kann mir jemand helfen
6 Antworten
Überlege dir erst, wie du eine einzelne Reihe ausgeben kannst, die beliebig viele Faktoren hat. Wie viele Faktoren es gibt, bestimmt die aktuelle Reihenanzahl.
Hier:
2! = 1 * 2 = 2
hättest du die Reihe 2, also liegen die Faktoren zwischen 1 und 2 (beide Grenzen inklusiv). Um jeden Faktor auszugeben, müsstest du daher von 1 bis 2 (inklusiv) zählen.
Sobald du diesen Schritt geschafft hast, brauchst du diese Operation lediglich so oft wiederholen, wie es Reihen gibt.
Bezüglich deines Codes: Nutze aussagekräftige Namen. Außerdem reicht es, für die Zahlendarstellungen mit dem primitiven Datentyp (int) zu arbeiten.
public static void main(String[] args) {
int n = 5; //ausgewählte fakultät
int ergebnis = 1;
System.out.print(n+"! = "); //schreibt die nummer mit einem rufezeichen; ist kein println, sondern nur print!!!
for (int i = 1; i <= n; i++){ //weißt du wie for schleifen funktionieren? wenn du sie nicht verstehst bitte in den kommentar schreiben
ergebnis *= i;
/*
andere umschreibung von ergebnis = ergebnis * i;
multipliziert also sich selbst mit der nächsten zahl:
zuerst ist ergebnis 1 und bleibt nach der ersten berechnung
und ausgabe 1 weil 1*1 = 1.
Dann beim 2. durchlauf 1*2 = 2. Beim 3. durchlauf 2*3 = 6.
usw.bis i die variable n erreicht.
*/
if(i < n) //damit beim letzten durchlauf nur i ausgegeben wird und nicht i* (wieder nur print und nicht println)
System.out.print(i + "*");
else
System.out.print(i);
}
System.out.println(" = "+ergebnis); //nach den ganzen rechenweg schreiben wir dann das ergebnis und machen mit println eine neue zeile
}
jetzt musst du nur noch eine bedingung schreiben, damit bei n = 0 nicht das raus kommt:
und erinnere dich, dass integers nicht unendlich groß sind und dass bei fakultäten die berechnung schnell an ihre grenzen führt.
- Nutz doch eindeutige Namen für deine Variablen
- In deiner ersten Syso-Ausgabe nutzt du "i" als Zahl, die vor der Fakultät angezeigt werden soll. In der While-Schleife nutzt du dafür x? Etwas mehr konsitenz wäre da hilfreich
- wofür hast du x, i und s, wenn x und s beide gleich erhöht werden?
Wie du vorgehen kannst:
nutze drei Variablen:
- einen Integer, der den momentanen Schritt angibt - bei dir im Beispiel 1, 2, 3, 4, 5 ...
- einen Integer, der den letzten Schritt angibt (auch wenn du das direkt in die Bedingung bringen könntest) - bei dir in dem Beispiel 5
- einen Integer (oder bei der Fakultät eher long), der das Ergebnis speichert (wobei du da relaiv schnell an die Grenzen des Integers kommst) - bei dir im Beispiel 1, 2, 6, 24, 120 ...
Damit arbeitest du jetzt soweit, dass du folgende Aussage bekommen kannst:
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
Jetzt hast du die Grundfunktionalität und zumindest ein korrektes Ergebnis. Jetzt fehlt noch der mittlere Teil, welcher die Rechnung zeigt. Hier gibt es mehrere Ansätze, du könntest jedoch einen String nehmen.
Dieser String enthält nicht nur ein "*", wie du es bisher hast, sondern die gesamte Rechnung bis dahin - also zuerst 1, dann 1*2, dann 1*2*3 usw ... du hängst also an den String jedes mal ein * und eine Zahl an
Wie hängt man an den String etwas dran ?
klassisch durch den + Operator
String s = "Hello";
s += "World";
System.out.println(s); // Ausgabe: HelloWorld
oder man nutzt einen StringBuilder.
jo, wobei das bei dem Anfängerlevel vermutlich zu hoch sein wird
Eine verallgemeinerte Form für die Aufgabe:
public static void printFacList(int end) {
for (int i = 1; i<=end; ++i) { // Schleife für jede Zeile
System.out.printf(
"%d! = %s = %d%n", // Muster für die printf-Funktion. %d = Zahl hinschreiben, %s = String hinschreiben, %n = neue Zeile
i, // Erster Teil
IntStream.rangeClosed(1, i).mapToObj(Integer::toString).collect(Collectors.joining(" * ")), // Zahlen von 1 bis end mit " * " verbinden
IntStream.rangeClosed(1, i).reduce((a,b)->a*b).getAsInt() // Zahlen von 1 bis n zusammenmultiplizieren
);
}
}
und nur die Zeilen bis 5 rufst du halt so auf:
printFacList(5);
Wie gefällt dir das. Die Ausgabe ist zwar ein klein wenig groß aber das ist meistens in Java so.
public class Main
{
public static void main(String[] args) {
int ergebnis = 1;
int b = 1;
int n = 5;
int x = 1;
while (b<=n){
ergebnis *= (b++);
System.out.print(x+"!=");
for(int i = 1; i <= x;i++){
System.out.print(i+(i < x ? "*" : ""));
}
System.out.println("="+ergebnis);
x++;
}
}
}
Wie hängt man an den String etwas dran ?