2010-12-15 13 views
3

Ich versuche, zwei Strings zu multiplizieren, aber ich bekomme die falsche Antwort. Jede Hilfe wird geschätzt:String-Multiplikation

public class stringmultiplication { 
    public static void main(String[] args) { 
     String s1 = "10"; 
     String s2 = "20"; 
     int num = 0; 
     for(int i = (s1.toCharArray().length); i > 0; i--) 
      for(int j = (s2.toCharArray().length); j > 0; j--) 
       num = (num * 10) + ((s1.toCharArray()[i - 1] - '0') * (s2.toCharArray()[j - 1] - '0')); 
     System.out.println(num); 
    } 
} 
+2

Ich nehme an, Sie bedeuten die Zahlen von zwei Strings dargestellt zu multiplizieren. Da es sich um eine Interviewfrage handelt, möchte ich Ihnen nicht die Antwort geben, aber ich werde darauf hinweisen, dass die Antwort viel einfacher ist als das, was Sie geschrieben haben. –

+2

Gibt es einen Grund, warum Sie s1 und s2 nicht in Zahlen konvertieren und damit arbeiten wollen? –

+0

Wenn Sie sich auf das Parsing als Integer beziehen, dann interessiert mich diese Lösung nicht, da die Frage ähnlich wie auf Papier war. – Jony

Antwort

3
public static void main(String[] args) { 
     String number1 = "108"; 
     String number2 = "84"; 

     char[] n1 = number1.toCharArray(); 
     char[] n2 = number2.toCharArray(); 

     int result = 0; 

     for (int i = 0; i < n1.length; i++) { 
      for (int j = 0; j < n2.length; j++) { 
       result += (n1[i] - '0') * (n2[j] - '0') 
         * (int) Math.pow(10, n1.length + n2.length - (i + j + 2)); 
      } 
     } 
     System.out.println(result); 
    } 

Diese sollte die korrekte Implementierung sein, ohne Ganzzahlen zu verwenden.

+0

Ihr Recht vielen Dank. – Jony

+2

können Sie mir sagen, warum es (int) Math.pow (10, n1.length * 2 - (i + j + 2)? Und auch Ihre Lösung funktioniert nicht, wenn es mehr als 2 Ziffern. – Jony

+0

Hm .. funktioniert für mich (zB. "123" * "256" gibt 31488) –

2

Du multiplizierst die Zahlen in der Zahl, und du handelst nicht die Befugnisse von 10 richtig.

Sie müssen zuerst die Zeichenfolgen in Ganzzahlen analysieren. Du bist hier auf der richtigen Spur. Sie können die Schleifenindizes vereinfachen und müssen nur toCharArray einmal aufrufen. Zum Beispiel:

Nach dem Parsen können Sie die ganzen Zahlen multiplizieren.

EDIT: Wenn das nicht erlaubt ist, müssen Sie einen Algorithmus wie this one implementieren, der ein bisschen komplizierter ist.

Ein Ansatz besteht darin, ein (n + 1) x (m + n) -Array zu erstellen (streng genommen ein Array von Arrays), wobei m und n die Anzahl der Ziffern in jedem sind. Es wird auf 0 initialisiert, und Sie können dies als Bereich verwenden, um die Zeilen der unmittelbaren und endgültigen Ergebnisse zu setzen. Diese werden dann mit Carry summiert. Dies ist offensichtlich ein näiver Algorithmus.

z. für das obige Beispiel:

int[][] intermediates = new int[3][4]; 

Dies ist eine obere Grenze.

+0

gibt es eine Möglichkeit, dass ich es tun kann ohne als Ganzzahl zu analysieren? – Jony

+0

@ Jonatan, Da dies eine Interviewfrage ist, könnte die nächste Antwort möglich sein (basierend auf der Antwort von Matthew Flaschen): Zuerst erstellen Sie eine 10x10-Matrix und füllen diese mit allen Multiplikationsergebnissen der ersten zehn Stellen. Danach könnten Sie, anstatt Zahlen zu multiplizieren, einfach hineinschauen Matrixwert für gegebenes Ergebnis (z.für "5" und "6", das wäre Matrix [5] [6]) und multiplizieren mit pow (10, _Hier würden Sie Indizes von Zeichen in Strings_ verwenden). –

1

Nachstehend ist die Lösung, die ich vorschlagen, was Sie vergessen haben zu tun, ist es, den Zwischenwert zu halten.

public class T{ 
    public static void main(String[] args) {  

     char[] num1 = "127".toCharArray();  
     char[] num2 = "32".toCharArray(); 

     int[] intermediate = new int[num1.length]; 

     for (int i = 0 ; i < num1.length ; i++) { 

       for(int j = 0 ; j < num2.length ; j++) { 


        int d1 = num1[num1.length - i - 1]-'0'; 
        int d2 = num2[num2.length - j - 1]-'0'; 


        intermediate[i] += d1 * d2 * (int) Math.pow(10,j); 

        System.out.printf(" %d X %d = %d\n", d1, d2, intermediate[i]); 

       }  

      intermediate[i] *= (int) Math.pow(10,i); 

      System.out.println(" intermediate : " + intermediate[i]); 
     }  


     int sum = 0; 

     for(int i : intermediate) { 
      sum += i; 
     } 

     System.out.println("Sum is = " + sum); 
    } 
} 
0

Ich fand Peter Algorithmus mit der POW-Funktion, ein bisschen verwirrend sein. Hier ist im Wesentlichen der gleiche Algorithmus. Konvertiere deine Strings in char [] und führe das dann aus.

public static int multiply (char A[], char B[]){ 
 
\t \t int totalSum = 0, sum = 0; 
 
\t \t for (int i = 0; i < A.length; i++){ 
 
\t \t \t sum = 0; 
 

 
\t \t \t for (int j = 0; j < B.length; j++){ 
 
\t \t \t \t sum *= 10; 
 
\t \t \t \t sum += (A[i] - '0') * (B[j] - '0'); 
 
\t \t \t \t 
 
\t \t \t } 
 
\t \t \t totalSum *=10; 
 
\t \t \t totalSum += sum; 
 
\t \t } 
 

 
\t \t return totalSum; 
 
\t }