Multiplikation nach der Schulmethode

F.S.WhiTeY

Bekanntes Mitglied
Hallo Leute,
ich versuche gerade zwei arrays nach der schulmethode zu Multiplizieren. Hab dazu auch schon was geschrieben aber irgendwo muss ich nen Fehler in meinem Code haben und ich find ihn nicht.

Ich weiß einfach nicht mehr weiter, vilt. findet ja jemand von euch den Fehler ?

Es sollen zwei Strings übergeben werden die Zahlen repräsentieren. Diese Zahlen sollen dann miteinander multipliziert werden und als String wieder zurück gegeben werden.

Das geht mit meiner Methode bis zu einer gewissen Stelle gut. Soll bedeuten, wenn ich mit BigInteger einen Vergleichswert ausgeben lasse sind die Strings bis zu einer gewissen Stelle gleich. danach wirds einfach nur falsch und ich komme nicht drauf woran es liegt.

Ich habe den Algorithmus auch schon für Integer Werte implemntiert, auch da war was falsch. Es sollte also nicht an dem hin und herrechnen mit Chars liegen sondern an der Multiplikationsmethode im allgemeinen.


LG WhiTeY

Java:
public String mulStringWithReminder(String s, String s2) {
		String erg = "";
		char[]a= new char[s.length()];
		char[]b= new char[s2.length()];
		int[]z=new int[a.length+b.length];
		int tmp = 0;
		int carry = 0;
		int j2 =0;
                //Zahlen umgedreht in Character Arrays Schreiben um damit rechnen zu können.
		 for (int i = 0; i < a.length; i++) {
			a[i]=s.charAt(a.length-1-i);
		}
		 for (int i = 0; i < b.length; i++) {
			b[i]= s2.charAt(b.length-1-i);
		}
		//Zwei Schleifen um alles miteinander zu Multiplizieren
		for (int j = 0; j < a.length; j++) {
			carry=0;
			for ( j2 = 0; j2 < b.length; j2++) {
		//ein wenig unschön aber für mich zur übersicht besser
               // Die zahlen 0-9 im ASCII Code haben den wert 48-56
              // Wenn man also 48 abzieht bekommt man den "Integerwert" und kann damit normal rechnen 
				int arg1 = a[j]-48;
				int arg2 = b[j2]-48;
             //Also rechnen wir ... stelle*stell+übertrag+das was an der ergebniss-stelle aus vorrangegangenen 
             //multiplikationen steht. Das erspart das zwischenspeicher der ergebnisse und das "Verschieben der Bits"
				tmp = arg1*arg2+carry+z[j+j2];
                                //übertrag berechnen
				carry = tmp / 10;
                                //ergebnis ohne übertrag an die vorgesehene stelle schreiben
				tmp=tmp%10;
				z[j+j2]=(tmp);
				
			}
			//Nun den übertrag noch verwerten
			int k= j+j2;
			while(carry!=0){
			k++;
			int t = carry % 10 +z[k];
			z[k]=(t);
			carry=carry/10;
			
			}
			
		}
		//Die zahl wieder als String repräsentieren 
		for (int i = z.length-1; i >=0; i--) {
			erg+=(char)(z[i]+48);
		}

        
		return erg;
	}
 

Marco13

Top Contributor
Hab' jetzt nicht genau geschaut, aber... das entweder mal im Debugger laufen lassen, oder zumindest sowas wie
Code:
System.out.println("Multipliziere Stelle "+i+" mit Wert "+a[i]);
System.out.println("und           Stelle "+j+" mit Wert "+b[j]);
...
System.out.println("Ergibt an Stelle "+k+" den Wert "+c[k]+" mit Übertrag "+carry);
und das dann mit 2 zweistelligen Zahlen testen, könnte schon helfen...
 

F.S.WhiTeY

Bekanntes Mitglied
das habe ich schon getan, komischerweise für kleinre zahlen funktioniert der algorithmus auch.
Ich hab ihn auch schon per hand nachgespielt, das hat auch geklappt....

wie gesagt ich hab gemacht und getan aber ich komme nicht drauf warum ab einer gewissen stelle fehler auftreten. nen überlauf kann es ja nicht geben. die zahlen sind auf jeden fall < 110 von daher verstehe ich es einfach nicht wie es dazu kommt
 

madboy

Top Contributor
Java:
public class Test2 {

   public static void main(String[] args) {

      for (int i = 0; i < 100; i++) {
         for (int j = 0; j < 100; j++) {
            int res1 = Integer.parseInt(mulStringWithReminder(String.valueOf(i), String.valueOf(j)));
            int res2 = i * j;
            if (res1 != res2) {
               System.out.println("ungleich: i=" + i + " j=" + j + " res1="
                     + res1 + " res2=" + res2);
            }
         }
      }
   }

   public static String mulStringWithReminder(String s, String s2) {
      String erg = "";
      char[] a = new char[s.length()];
      char[] b = new char[s2.length()];
      int[] z = new int[a.length + b.length];
      int tmp = 0;
      int carry = 0;
      int j2 = 0;
      // Zahlen umgedreht in Character Arrays Schreiben um damit rechnen zu
      // können.
      for (int i = 0; i < a.length; i++) {
         a[i] = s.charAt(a.length - 1 - i);
      }
      for (int i = 0; i < b.length; i++) {
         b[i] = s2.charAt(b.length - 1 - i);
      }
      // Zwei Schleifen um alles miteinander zu Multiplizieren
      for (int j = 0; j < a.length; j++) {
         carry = 0;
         for (j2 = 0; j2 < b.length; j2++) {
            // ein wenig unschön aber für mich zur übersicht besser
            // Die zahlen 0-9 im ASCII Code haben den wert 48-56
            // Wenn man also 48 abzieht bekommt man den "Integerwert" und kann
            // damit normal rechnen
            int arg1 = a[j] - 48;
            int arg2 = b[j2] - 48;
            // Also rechnen wir ... stelle*stell+übertrag+das was an der
            // ergebniss-stelle aus vorrangegangenen
            // multiplikationen steht. Das erspart das zwischenspeicher der
            // ergebnisse und das "Verschieben der Bits"
            tmp = arg1 * arg2 + carry + z[j + j2];
            // übertrag berechnen
            carry = tmp / 10;
            // ergebnis ohne übertrag an die vorgesehene stelle schreiben
            tmp = tmp % 10;
            z[j + j2] = (tmp);

         }
         // Nun den übertrag noch verwerten
         int k = j + j2;
         while (carry != 0) {
            k++;
            int t = carry % 10 + z[k];
            z[k] = (t);
            carry = carry / 10;

         }

      }
      // Die zahl wieder als String repräsentieren
      for (int i = z.length - 1; i >= 0; i--) {
         erg += (char) (z[i] + 48);
      }

      return erg;
   }

}

resultiert bei i=2 j=4 in einer
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at Test2.mulStringWithReminder(Test2.java:60)
at Test2.main(Test2.java:7)

Folglich stimmt da wirklich was nicht ;-)

EDIT: was ich sagen will ist, dass du entweder den falschen Code gepostet hast oder nicht richtig getestet oder deine Fehlerbeschreibung irgendwie nicht zum Problem passt.
 
Zuletzt bearbeitet:

F.S.WhiTeY

Bekanntes Mitglied
der code sollte der richtige sein....

Java:
public String mulStringWithReminder(String s, String s2) {
		String erg = "";
		char[]a= new char[s.length()];
		char[]b= new char[s2.length()];
		int[]z=new int[a.length+b.length];
		int tmp = 0;
		int carry = 0;
		int j2 =0;
		 for (int i = 0; i < a.length; i++) {
			a[i]=s.charAt(a.length-1-i);
		}
		 for (int i = 0; i < b.length; i++) {
			b[i]= s2.charAt(b.length-1-i);
		}
		
		for (int j = 0; j < a.length; j++) {
			carry=0;
			for ( j2 = 0; j2 < b.length; j2++) {
				
				int arg1 = a[j]-48;
				int arg2 = b[j2]-48;
				tmp = arg1*arg2+carry+z[j+j2];
				carry = tmp / 10;
				tmp=tmp%10;
				z[j+j2]=(tmp);
				
			}
			
			int k= j+j2;
			while(carry!=0){
			k++;
			int t = carry % 10 +z[k];
			z[k]=(t);
			carry=carry/10;
			
			}
			
		}
		
		for (int i = z.length-1; i >=0; i--) {
			erg+=(char)(z[i]+48);
		}

        
		return erg;
	}


getestet mit einigen variationen z.b. :

93273528230*193273528230

Ergebnis BigInteger:
37354656 714472606932900
Ergebnis meiner methode:
127445565 714472606932900


Aufruf in der main :
BigInteger tt = new BigInteger("193273528230");
tt= tt.multiply(tt);
System.out.println(tt.toString());
System.out.println(ar.mulStringWithReminder("193273528230","193273528230");

Keine Exceptions, nur falsche werte ^^ mit allen werten die ich bis hierher getestet habe.

LG
 

madboy

Top Contributor
Entweder bin ich zu müde oder du testest falsch. Habe die selbe Exception bei den selben Eingaben (scheint der selbe Code zu sein). Warum fängst du überhaupt bei 93273528230*193273528230 statt bei 0*0 an?
 

F.S.WhiTeY

Bekanntes Mitglied
Cool dein Test hat es echt gebracht, ich hatte vorher nie eine exception.

Der fehler ist gefunden :

Java:
......

            int k= j+j2-1;//MINUS EINS MUSS DA HIN :D
            while(carry!=0){
            k++;
            int t = carry % 10 +z[k];
            z[k]=(t);
            carry=carry/10;
            
            }
.....


Danke dir, hast mir die nacht gerettet ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
padde479 Array Multiplikation der ersten n Zahlen Java Basics - Anfänger-Themen 7
S Multiplikation von zwei Labels Java Basics - Anfänger-Themen 7
F Matrix Multiplikation Java Basics - Anfänger-Themen 3
G Java Bruchrechner Addition, Multiplikation... Java Basics - Anfänger-Themen 12
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
O Erstes Programm: Matrizen Multiplikation Java Basics - Anfänger-Themen 10
H Variablen Multiplikation einer inkrementierten Variablen Java Basics - Anfänger-Themen 5
D Methoden Matrix Multiplikation Java Basics - Anfänger-Themen 27
J Funktionsaufrufe Multiplikation von Arrays Java Basics - Anfänger-Themen 3
Joker4632 Klassen BigDecimal Multiplikation liefert nicht erwarteten Wert Java Basics - Anfänger-Themen 6
TomatenBrot447 Adapter für eine optimierte Multiplikation Java Basics - Anfänger-Themen 5
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
K Multiplikation zweier Matrizen Java Basics - Anfänger-Themen 23
P Variablen Negatives Ergebnis bei Multiplikation von großen Zahlen Java Basics - Anfänger-Themen 2
R Matrix-Vektor-Multiplikation Java Basics - Anfänger-Themen 13
K Seltsames Ergebnis in Netbeans bei einfacher Multiplikation Java Basics - Anfänger-Themen 5
T Operatoren Multiplikation nur mit Addition, Subtraktion und Vergleich Java Basics - Anfänger-Themen 29
S Multiplikation durch Addition, Subtraktion und Vergleich von Zahlen Java Basics - Anfänger-Themen 14
V Vor jeder Multiplikation den linken Multiplikator abrunden Java Basics - Anfänger-Themen 4
M Matrix Matrix Multiplikation Java Basics - Anfänger-Themen 6
W Multiplikation mit rekursivem Aufruf Java Basics - Anfänger-Themen 17
S Multiplikation von großen Zahlen, ohne BigInt uä Java Basics - Anfänger-Themen 7
K Matrizen Multiplikation Java Basics - Anfänger-Themen 3
B Multiplikation bei Generics Java Basics - Anfänger-Themen 9
G Multiplikation falsches Ergebnis Java Basics - Anfänger-Themen 5
K double Multiplikation Java Basics - Anfänger-Themen 2
K einfache Multiplikation Java Basics - Anfänger-Themen 6
2 Variablenüberlauf bei Addition, Multiplikation Java Basics - Anfänger-Themen 2
O Überlauf durch Multiplikation Java Basics - Anfänger-Themen 7
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
I Java Mail Timeout erst nach rund 5 Minuten? Java Basics - Anfänger-Themen 9
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
Jambolo Karten sortieren nach Rang und Farbe Java Basics - Anfänger-Themen 5
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
D Programmieren nach UML Java Basics - Anfänger-Themen 2
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
L Zahlungen nach Monat filtern Java Basics - Anfänger-Themen 2
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
I String nach Wort suchen Java Basics - Anfänger-Themen 6
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
O 2D-Array nach einer Spalte sortieren Java Basics - Anfänger-Themen 22
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
C Meldung einer Klasse nach "oben" Java Basics - Anfänger-Themen 6
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
M Anzahl Schleifendurchgänge nach x Sekunden anzeigen Java Basics - Anfänger-Themen 2
C Lotto 3, 4, 5, 6 Richtige nach x Ziehungen ermittelt.. Java Basics - Anfänger-Themen 7
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
R JDK installieren Durcheinander nach installation von SE 14.02 Java Basics - Anfänger-Themen 6
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
B DateTimeFormatter nach LocalDateTime, wenn dd.MM.yyyy oder dd.MM.yyyy mm:hh Java Basics - Anfänger-Themen 5
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
S Wohin kommt das „abstract“? Vor oder nach „public“/ „private“ /... Java Basics - Anfänger-Themen 3
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
B Umstieg von C# nach Java Java Basics - Anfänger-Themen 18

Ähnliche Java Themen

Neue Themen


Oben