簡體   English   中英

C ++中的大數乘法

[英]Large numbers multiplication in C++

我正在尋找一個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數組而不是字符串? 但我不確定為數組重新分配內存是否比創建字符串對象更快。

快速大數乘法是一個很大的項目。 一個非常大的項目,取決於您要相乘多少個數字。

然而,最簡單的重要事情可能是你希望從CPU的本機指令中獲得盡可能多的里程數。 64位數字的添加功能比8位數字的添加功能強大8倍,比十進制數字的添加功能強大19倍以上。 但是您的計算機添加64位數字的速度可能與添加8位數字的速度一樣快,並且比您編寫任何用於添加十進制數字的代碼要快得多。

乘法更加戲劇化。 將兩個64位數相乘以產生128位結果的指令所做的工作量大約是將兩個8位數相乘以產生16位結果的指令的64倍 - 但是你的CPU可能會在相同的速度,或者后者的速度是前者的兩倍。

因此,您確實希望將數據結構和基本案例算法的方向圍繞着盡可能多地使用這些功能更強大的指令的想法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM