2012-12-03 143 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; 
    } 


}