Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl

Miriam Manda

Mitglied
Weiß jemand, warum dieser Code nicht funktioniert. Ist "long" nicht der Typ, um die größten Zahlen zu speichern?
Ein- und Ausgabe sollen jeweils Strings sein.


Java:
public class Fact {

       public static void main(String[] args) {

        System.out.println(factorial("4") + " (24 ist richtig)");
        System.out.println(factorial("1337") + " (3316........... (mit 5736 Ziffern) wäre korrekt.)");
       }

       public static String factorial(String x){
         long fact=1;
         String result="";
             for (int i=1; i <= Integer.parseInt(x); i++) {
             fact=fact*i;
             result = Long.toString(fact);
             }
          return result;
        }
}
 
Zuletzt bearbeitet:
+9.223.372.036.854.755.807! Dann hätte es mit 1337! schon auch nicht mehr funktioniert. Ich verstehe.
Kann ich dann gar keine Fakultäten berechnen mit Java?
 
Wenn die Standard Datentypen nicht ausreichen, dann muss man sich eigene Datentypen schaffen.

Und wie es der Zufall so will: so Anforderungen, die öfters vorkommen, sind oft Dutch Libraries abgedeckt.

Das Java Framework enthält BigInteger - Die Klasse willst Du Dir evtl. mal ansehen…
 
Ich bin auch gerade auf BigInteger gestoßen, aber erhalte noch die Meldung
Java:
BigInteger cannot be resolved to a type
obwohl ich schon
Code:
import java.math.*;
dazugefügt habe. Und den Befehl
Code:
BigInteger.toString(fact);
wird es voraussichtlich auch nicht geben.
 
Muß ich vielleicht in Eclipse noch den Zugriff von java.math auf Eclipse / die Klasse autorisieren? Denn Eclipse fragt weiterhin, ob es java.math importieren soll, obwohl ich schon der der ersten Zeile
Code:
import java.math.*;
eingetragen habe?
 
Ich hoffe, es ist eine Instanz von BigInteger, wenn ich die Instanz so verwende:
Code:
import java.math.*;

public class Fact {

       public static void main(String[] args) {

        System.out.println(factorial("4") + " (24 ist richtig)");
        System.out.println(factorial("2000") + " (3316........... (mit 5736 Ziffern) wäre korrekt.)");
       }

       public static String factorial(String x){
         BigInteger fact = 1;
         String result="";
             for (int i=1; i <= Integer.parseInt(x); i++) {
             fact=fact*i;
             result = BigInteger.toString(fact);
             }
          return result;
        }
}
 
Hast Du schon mit Klassen gearbeitet? Überlege einmal, was für Zuweisungen möglich sind. Wenn Du ein Auto haben willst: Dann lässt Du Dir doch auch kein Apfel geben (um dann mit dem Apfel einkaufen zu fahren ... irgendwie ist ein Apfel einfach kein Auto ...)

Die 1 ist ein Integer Literal also ein int. Das ist also kein BigInteger.
Du musst Dir also eine BigInteger Instanz erzeugen. Schau einfach mal in die verlinkte Dokumentation - vielleicht findest Du ja einen Konstruktor oder passnde Konstanten oder so ...

Und die Operatoren in Java sind nur für bestimmte Typen definiert und daher sind die nur zulässig für eben diese Typen (sowie für Typen, für die Java eine implizite Umwandlung vorsieht). Auf Instanzen ist es üblich, Methoden aufzurufen. Evtl. findest du ja in BigInteger paar Methoden, mit denen du etwas anfangen könntest.
 
Ich hab's. Vielen Dank für die freundliche Hilfe!
Java:
import java.math.*;

public class Fact {

       public static void main(String[] args) {       
        System.out.println(factorial("4") + " (24 ist richtig)");
        System.out.println(factorial("2000") + " (3316........... (mit 5736 Ziffern) wäre korrekt.)");
       }
      
       public static String factorial(String x){
           BigInteger fact = new BigInteger("1");
                
             for (int i=1; i <= Integer.parseInt(x); i++) {
             fact = fact.multiply(new BigInteger("" + i));
             }
              return fact.toString();
       }   
}
 

Zurück
Oben