两个链表中的数字乘法

时间:2012-12-03 19:16:06

标签: c# linked-list

我试图将存储在两个单链表中的数字相乘。但是,我的算法变得非常复杂。我正在按照我们在小学的方式进行增殖。获取其中一个列表的值并将其乘以另一个列表的每个值,直到我们覆盖所有数字。问题是我必须在最后添加这些数字以获得乘法的最终结果,这就是我遇到麻烦的地方。我必须找到一种方法,能够将任意数量的元素相互叠加,并能够在最后添加结果。到目前为止,我的代码就像这样

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方法,该方法将两个链接列表作为参数并进行添加。我需要能够为我想要的数量做这个过程。 任何建议或者你是否知道有任何更好的方法来进行乘法运算?

2 个答案:

答案 0 :(得分:0)

这看起来像是一个简单问题的必然复杂的暗示。闻起来像家庭作业。

你提到你在最后添加值时遇到了麻烦(就像你在长乘法中那样。

我建议实施sum方法,并使用sum列表。

将总和列表初始化为0,然后在乘法过程的每次迭代后,使用sum方法将新列表添加到sum列表。


或者,你可以在乘法的第一部分有一个列表列表,然后在最后将所有这些列表加在一起。

此实现将占用更多内存,但可视化也更容易一些。

答案 1 :(得分: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;
    }


}