c ++将两个存储在链表中的大数相乘

时间:2017-05-16 07:33:03

标签: c++ c++11 math linked-list integer-arithmetic

我正在尝试编写一个代码,它将乘以两个大数字。两个数字都被分割并存储在链表中。

在我的情况下,每个节点都有8位数字。例如:324367823457572583将存储为

32 | 43678234 | 57572583

以下是代码:

std::list<long long> multiply(const std::list<long long>& _a, const std::list<long long>& _b)
{
    std::list<long long> ret;
    int mod = 1e8, rem = 0;
    auto retit = ret.rbegin(), cur = retit;
    for(auto it2 = _b.rbegin(); it2 != _b.rend(); ++it2, ++cur)
    {
        retit = cur;

        for(auto it1 = _a.rbegin(); it1 != _a.rend(); ++it1, ++retit)
        {
            long long a = (*it2) * (*it1) + rem;
            if(retit == ret.rend())
                ret.push_front(a%mod);
            else
                a += *retit, *retit = a%mod;
            rem = a/mod;
        }
        *retit += rem, rem = 0;
    }
    return ret;
}

我相信这段代码应该可行,但它会输出错误的答案......

34677523234 * 672891258627 =

2333420 22549932 95439718(计算器输出)

2328204 22549932 95439718(我的输出)

2 个答案:

答案 0 :(得分:2)

您的乘法例程中存在多个问题。

  • 乘以两个整数时32位溢出
  • 解除引用retit
  • rend()

此处corrected version

std::list<int> multiply(const std::list<int>& _a, const std::list<int>& _b)
{
    std::list<int> ret;
    int mod = 100000000, rem = 0;
    auto retit = ret.rbegin(), cur = retit;
    for (auto it2 = _b.rbegin(); it2 != _b.rend(); ++it2, ++cur)
    {
        retit = cur;

        for (auto it1 = _a.rbegin(); it1 != _a.rend(); ++it1, ++retit)
        {
            long long a = static_cast<long long>(*it2) * (*it1) + rem;
            if (retit == ret.rend())
                ret.push_front(a%mod);
            else
                a += *retit, *retit = a%mod;
            rem = (int)(a / mod);
        }
        if (rem)
        {
            if (retit == ret.rend())
                ret.push_front(rem);
            else
                *retit += rem;
            rem = 0;
        }
    }
    return ret;
}

示例输入的输出:

2333420 22549932 95439718 

答案 1 :(得分:1)

您的问题在long long a = (*it2) * (*it1) + rem;

*it1*it2int s,因此乘法的结果也是int,它将溢出。您应该在乘法之前转换为long long

long long a = (long long)*it2 * *it1 + rem;