2012-12-03 148 views
0

我試圖乘以兩個單獨鏈接列表中存儲的數字。但是,我的算法變得越來越複雜。我正在按照我們在小學所做的方式進行乘法運算。獲取其中一個列表的價值並將其與另一個列表的每個值相乘,直到涵蓋所有數字。問題是我必須在最後加上這些數字才能獲得乘法的最終結果,這就是我遇到麻煩的地方。我必須找到一種方法,能夠將任意數量的元素相互疊加,並能夠在最後添加結果。到目前爲止,我的代碼是這樣的兩個鏈接列表中的數字相乘

public SingleyLinkedList Multiply(SingleyLinkedList list1, 
            SingleyLinkedList list2) 
     { 
     SingleyLinkedList multiplyList = new SingleyLinkedList(); 
     SingleyLinkedList tempList1 = new SingleyLinkedList(); 
     SingleyLinkedList tempList2 = new SingleyLinkedList(); 

     for (int j = 0; j < list2.Size(); j++) 
     { 
      int carry = 0; 
      int B = Convert.ToInt32(list2.GetValue(j)); 

      for (int k = 0; k < list1.Size(); k++) 
      { 

       int A = Convert.ToInt32(list1.GetValue(k)); 

       if (k == list1.Size()-1) 
       { 
        int multiply = ((A * B) + carry); 
        multiplyList.InsertAtFront(multiply); 
        carry = 0; 
       } 
       if (k < list1.Size()-1) 
       { 
        int multiply = ((A * B) + carry) % 10; 
        multiplyList.InsertAtFront(multiply); 
        carry = 0; 
       } 
       carry = (int)((A * B)/10); 
      } 
     } 
     //return multiplyList; 

     for (int t = 0 ; t < list2.Size() ; t++) 
     { 

      for (int n = 0; n < list1.Size(); n++) 
      { 
       int val = Convert.ToInt32(multiplyList.GetValue(n)); 
       tempList1.InsertAtFront(val); 
      } 

      // adding zero to take care of 10th     
      for (int m = 0; m < list2.Size() - 1; m++) 
      { 
       tempList1.InsertAtFront(0); 
      } 

     } 

     return tempList1;` 

這個階段之後,我有我的價值觀傳遞給我創造了Add方法,它有兩個鏈表作爲參數,並做加法。我需要能夠爲我想要的數量做這個過程。 任何建議,或者如果你知道任何更好的方法來完成乘法?

+1

你能更清楚地定義你的要求嗎? –

+0

它可以是點積,但不一定。我想用352乘以3541.我的程序創建了兩個單獨鏈接列表{1,4,5,3}和{2,5,3}。那麼這些元素會逐一相乘,並創建一個{10,6,2,3,17,7,0,5,7,0,8,2}的臨時列表。我必須建立從這個鏈表。可能有更好的方法來做到這一點,但我還不知道。 – user843681

+0

是的,還有更好的方法來做到這一點。使用內置的乘法功能。爲什麼你必須使用鏈表? –

回答

0

這看起來像一個簡單的問題,不必要的複雜implimentation。聞起來像功課。

您提到,您無法在結尾處增加了值(就像你在長期的乘法會。

我建議實施sum方法,並且還使用sum列表。

初始化和列表0,然後增殖過程的每一個迭代後,使用sum方法給你新的列表添加到列表sum


或者,您可以爲您的乘法的第一部分創建一個List列表,然後將所有這些列表彙總在一起。

該實現需要多一點內存,但它也會更容易可視化。

+0

你是在說Linq的總和方法嗎?我不能使用它。這是挑戰的條件。 – user843681

+0

@ user843681你可以做出自己的總和方法嗎? –

+0

我已經創建。它是addLists(SinglyLinkedList list1,SinglyLinkedList list2)。它需要兩個單獨鏈接的列表,並在數字上做了一堆東西,並創建一個最終鏈接列表,其中包含按正確順序添加的結果數字。我已經創建了這個方法,它正常工作。 – user843681

0

您可能想要複製此Java代碼。

import java.util.LinkedList; 
import java.util.ListIterator; 

public class MultiplyTwoLinkedLists { 

    public static void main(String[] args) { 

     LinkedList<Integer> number1 = new LinkedList<Integer>(); 
     LinkedList<Integer> number2 = new LinkedList<Integer>(); 
     number1.addFirst(1); 
     number1.addFirst(2); 

     number2.addFirst(1); 
     number2.addFirst(2); 

     multiply(number1, number2); 
    } 

    public static int multiply(LinkedList<Integer> n1, LinkedList<Integer> n2){ 

     int placeValue1 = 1; 
     int sum=0; 
     for(int digit1 : n1){ 
      int placeValue2 = 1; 
      for(int digit2 : n2){ 
       sum+=((digit1*placeValue1) * (digit2*placeValue2)); 
       placeValue2=placeValue2*10; 
      } 
      placeValue1=placeValue1*10; 
     } 
     System.out.println(sum); 
     return 1; 
    } 


}