c ++中的长整数乘法

时间:2015-07-13 10:23:13

标签: c++

我是C ++的初学者。我正在尝试这个长整数乘法。我不理解sum[3][0]的值在后续循环周期中是如何变化的。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string num1, num2;
    int i,j,l1, l2,temp,k;
    cout << "Enter first number: ";
    cin >> num1;
    cout << "Enter second number: ";
    cin >> num2;
    l1= num1.size();
    l2= num2.size();

    cout << l1 << "  " << l2 << endl;

    int sum[l2-1][l2];        //         5 6 7 8   ---> num1
                              //         1 2 3 4   ---> num2
    for(i=0; i<l1; i++)       //       ---------
        num1[i]-='0';          //       2 2 7 1 2    sum[3][4]---->sum[3][0]
                               //     1 7 0 3 4         i.e sum[3][0] should be 2
    for(i=0; i<l2; i++)        //   1 1 3 5 6
        num2[i]-='0';          //   5 6 7 8
                              //   -------------
    for(i=l2-1; i>=0; i--)    //   7 0 0 6 6 5 2
    {
        k=0;
        temp=0;
        for(j=l1-1; j>=0; j--)
        {
            temp+=(num2[i]*num1[j]);
            sum[i][k]= temp%10;
            temp=temp/10;
            k++;
        }
        sum[i][k]=temp;
        cout << sum[3][0] << endl;
    }

    for(i=l2-1; i>=0; i--)      // output is 2 2 7 1 1     Here value of sum[3][0] is 1 but the desired output is 2.
    {                           //           1 7 0 3 1
        for(k=l2; k>=0; k--)    //           1 1 3 5 0
            cout << sum[i][k];  //           0 5 6 7 8 
        cout << endl;
    }


    return 0;
}

我尝试了这个代码,用于案例num1 = 5678和num2 = 1234。因此,在这种情况下,sum [3] [0]应为2。

2 个答案:

答案 0 :(得分:1)

你的金额不够大。你使用sum [0..l2-1] [0..l1]所以大小需要是sum [l2] [l1 + 1]。

当你超过第二个dim dim时,通常会将一行sum share存储的一部分与另一行共享,所以你存储sum [2] [0]的地方就是你以后存储的地方sum [1 ] [4]

当你超过sum的第一个dim(或最后一行的第二个dim)时,它会与其他东西共享存储,例如(但不一定)该函数的本地其他变量。

此外,显示总和的循环不正确。您可以使用从l2-1到0的总和以及从0到L1的列。但是您将列l2显示为0.列是基于l1计算的,因此应基于l1显示。如果您尝试使用l1不等于l2的示例,则该错误会出现症状。

答案 1 :(得分:0)

sum数组应该像这样创建:

int sum[l2][max(l1,l2)+1];

现在存储计算结果太小了。

为什么程序在写出数组边界时不会崩溃?因为C++没有任何数组边界检查。

说实话,您应该按new声明数组,并在delete不再需要时将其删除。 C++标准不提供在没有new的情况下创建非常量大小的数组。只有一些编译器支持它作为扩展,当你这样做时,许多编译器会打印警告。更多信息:How do I declare a 2d array in C++ using new?