【问题标题】:c++ multiplying two large numbers stored in linked listc ++将存储在链表中的两个大数相乘
【发布时间】:2017-05-16 07:33:02
【问题描述】:

我正在尝试编写一个将两个大数相乘的代码。这两个数字被划分并存储在一个链表中。

就我而言,每个节点都有 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(我的输出)

【问题讨论】:

  • 你应该做一些调试。

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


【解决方案1】:

您的乘法程序中有多个问题。

  • 两个整数相乘时出现 32 位溢出
  • 取消引用指向rend()retit

这里是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 

【讨论】:

  • (long long)value 是一个 c 类型转换...你最好使用 c++ 类型转换 (static_cast(value))。有以下转换: dynamic_cast (expression) reinterpret_cast (expression) static_cast (expression) const_cast (expression)
  • @Thomas 没有特殊原因,只是个人喜好问题。
  • if (rem) { if (retit == ret.rend()) ret.push_front(rem);否则 *retit += rem; rem = 0; } 那人修好了。
【解决方案2】:

你的问题在long long a = (*it2) * (*it1) + rem;这一行

*it1,*it2ints,所以相乘的结果也是int,会溢出。你应该在乘法之前转换为long long

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

【讨论】:

  • 抱歉误导.. 实际代码非常大,所以我编辑了函数,似乎我犯了错误。我会编辑
  • 我写的输出很长
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多