C ++中的大数乘法

时间:2015-02-12 19:37:00

标签: c++ arrays string multiplication

我正在寻找C ++中的快速大数乘法算法。 我尝试过类似的东西,但我认为我创建了太多的字符串对象。

string sum(string v1, string v2)
{
    string r;
    int temp = 0, i, n, m;
    int size1 = v1.size(), size2 = v2.size();
    n = min(size1, size2);
    m = max(size1, size2);
    if ((v1 == "0" || v1 == "") && (v2 == "0" || v2 == "")) return "0";
    r.resize(m, '0');
    for (i = 0; i < n; i++)
    {
        temp += v1[size1 - 1 - i] + v2[size2 - 1 - i] - 96;
        r[m - 1 - i] = temp % 10 + 48;
        temp /= 10;
    }
    while (i < size1)
    {
        temp += v1[size1 - 1 - i] - 48;
        r[m - 1 - i] = (char)(temp % 10 + 48);
        temp /= 10;
        ++i;
    }
    while (i < size2)
    {
        temp += v2[size2 - 1 - i] - 48;
        r[m - 1 - i] = (char)(temp % 10 + 48);
        temp /= 10;
        ++i;
    }
    if (temp != 0) 
        r = (char)(temp + 48) + r;
    return r;
}

string multSmall(string v1, int m)
{
    string ret = "0";
    while(m)
    {
        if (m & 1) ret = sum(ret, v1);
        m >>= 1;
        if (m) v1 = sum(v1, v1);
    }
    return ret;
}

string multAll(string v1, string v2)
{
    string ret = "0", z = "", pom;
    int i, size;
    if (v1.size() < v2.size())
        std::swap(v1, v2);
    size = v2.size();
    for (i = 0; i < size; i++)
    {
        pom = multSmall(v1, v2[size - 1 - i] - 48);
        pom.append(z);
        ret = sum(ret, pom);
        z.resize(i + 1, '0');
    }
    return ret;
}

我不想使用任何外部库。我该怎么办?也许我应该使用char数组而不是字符串?但我不确定为数组重新分配内存是否比创建字符串对象更快。

1 个答案:

答案 0 :(得分:0)

快速大数乘法是一个很大的项目。一个非常大的项目,取决于你想要多大的数字。

然而,可能最简单的重要的事情是,您希望从CPU的本机指令中获得尽可能多的里程数。添加64位数字的功能比添加8位数字强8倍,比添加小数位数的功能强19倍。但是你的计算机可能会添加64位数字,就像它可以添加8位数字一样快,并且比你编写的任何代码都要快得多,只能添加十进制数字。

乘法更具戏剧性;将两个64位数相乘以产生128位结果的指令所做的工作量大约是将两个8位数相乘以产生16位结果的指令的64倍 - 但是你的CPU可能会在相同的速度,或者后者的速度是前者的两倍。

因此,您真的希望将数据结构和基本案例算法定位为尽可能多地使用这些更强大的指令。

如果你需要,你可以把它想象为在2 ^ 64基础上做算术。 (或者可能是2 ^ 32,如果你不能或不想使用64位算术)