Java frage?

Bnl11  16.02.2022, 11:18

Wie hast du Java gelernt ?

syzzz 
Beitragsersteller
 16.02.2022, 11:31

in der schule und auf yt

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:

Bild zum Beitrag

und erinnere dich, dass integers nicht unendlich groß sind und dass bei fakultäten die berechnung schnell an ihre grenzen führt.

 - (Computer, Schule, programmieren)
  1. Nutz doch eindeutige Namen für deine Variablen
  2. 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
  3. wofür hast du x, i und s, wenn x und s beide gleich erhöht werden?

Wie du vorgehen kannst:

nutze drei Variablen:

  1. einen Integer, der den momentanen Schritt angibt - bei dir im Beispiel 1, 2, 3, 4, 5 ...
  2. einen Integer, der den letzten Schritt angibt (auch wenn du das direkt in die Bedingung bringen könntest) - bei dir in dem Beispiel 5
  3. 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


syzzz 
Beitragsersteller
 16.02.2022, 11:30

Wie hängt man an den String etwas dran ?

1
xxxcyberxxx  16.02.2022, 11:34
@syzzz
Wie hängt man an den String etwas dran ?

klassisch durch den + Operator

String s = "Hello";
s += "World";
System.out.println(s); // Ausgabe: HelloWorld
0
regex9  16.02.2022, 11:34
@syzzz

Entweder via Konkatenationsoperator (+)

String sentence = "Hello" + " world";
sentence += "!";

oder man nutzt einen StringBuilder.

1
xxxcyberxxx  16.02.2022, 11:35
@regex9
oder man nutzt einen StringBuilder.

jo, wobei das bei dem Anfängerlevel vermutlich zu hoch sein wird

1

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++;
        }
	}
}

Woher ich das weiß:Studium / Ausbildung

tommy1T  16.02.2022, 11:48
  System.out.print(i+(i < x ? "*" : ""));

sexy

0