C#,《小白学程序》第二十五课:大数乘法(BigInteger Multiply)的Karatsuba算法及源代码

1 文本格式

/// <summary>

/// 《小白学程序》第二十五课:大数(BigInteger)的Karatsuba乘法

/// Multiplies two bit strings X and Y and returns result as long integer

/// </summary>

/// <param name="a"></param>

/// <param name="b"></param>

/// <returns></returns>

public static string karatsuba_multiply(string a, string b)

{

// Find the maximum of lengths of x and Y and make

// length of smaller string same as that of larger string

int n = Math.Max(a.Length, b.Length);

if (a.Length != n) a = a.PadLeft(n, '0');

if (b.Length != n) b = b.PadLeft(n, '0');

// Base cases

if (n == 0)

{

return "0";

}

else if (n == 1)

{

return ((a[0] - '0') * (b[0] - '0')).ToString();

}

else if (n <= 9)

{

// int max 21474 83647

// long max 9223 37203 68547 75807

return (ulong.Parse(a) * ulong.Parse(b)).ToString();

}

int fh = n / 2; // First half of string

int sh = n - fh; // Second half of string

// Find the first half and second half of first string.

string x1 = a.Substring(0, fh);

string x2 = a.Substring(fh);

// Find the first half and second half of second string

string y1 = b.Substring(0, fh);

string y2 = b.Substring(fh);

// Recursively calculate the three products of

// inputs of size n/2

string p1 = karatsuba_multiply(x1, y1);

string p2 = karatsuba_multiply(x2, y2);

//string P3 = Karatsuba(AddBitStrings(Xl, Xr), AddBitStrings(Yl, Yr));

string p3 = karatsuba_multiply(big_integer_plus(x1, x2), big_integer_plus(y1, y2));

// Combine the three products to get the final result.

//return P1 * (1L << (2 * sh)) + (P3 - P1 - P2) * (1L << sh) + P2;

int[] t1 = new int[sh];

string w1 = String.Join("", t1);

string v1 = p1 + w1 + w1;

string v2 = big_integer_subtract(p3, big_integer_plus(p1, p2)) + w1;

return big_integer_plus(v1, big_integer_plus(v2, p2));

}

2 代码格式

cs 复制代码
/// <summary>
/// 《小白学程序》第二十五课:大数(BigInteger)的Karatsuba乘法
/// Multiplies two bit strings X and Y and returns result as long integer
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static string karatsuba_multiply(string a, string b)
{
    // Find the maximum of lengths of x and Y and make
    // length of smaller string same as that of larger string
    int n = Math.Max(a.Length, b.Length);
    if (a.Length != n) a = a.PadLeft(n, '0');
    if (b.Length != n) b = b.PadLeft(n, '0');

    // Base cases
    if (n == 0)
    {
        return "0";
    }
    else if (n == 1)
    {
        return ((a[0] - '0') * (b[0] - '0')).ToString();
    }
    else if (n <= 9)
    {
        // int max 21474 83647
        // long max 9223 37203 68547 75807
        return (ulong.Parse(a) * ulong.Parse(b)).ToString();
    }

    int fh = n / 2;  // First half of string
    int sh = n - fh; // Second half of string

    // Find the first half and second half of first string.
    string x1 = a.Substring(0, fh);
    string x2 = a.Substring(fh);

    // Find the first half and second half of second string
    string y1 = b.Substring(0, fh);
    string y2 = b.Substring(fh);

    // Recursively calculate the three products of
    // inputs of size n/2
    string p1 = karatsuba_multiply(x1, y1);
    string p2 = karatsuba_multiply(x2, y2);
    //string P3 = Karatsuba(AddBitStrings(Xl, Xr), AddBitStrings(Yl, Yr));
    string p3 = karatsuba_multiply(big_integer_plus(x1, x2), big_integer_plus(y1, y2));

    // Combine the three products to get the final result.
    //return P1 * (1L << (2 * sh)) + (P3 - P1 - P2) * (1L << sh) + P2;
    int[] t1 = new int[sh];
    string w1 = String.Join("", t1);
    string v1 = p1 + w1 + w1;
    string v2 = big_integer_subtract(p3, big_integer_plus(p1, p2)) + w1;
    return big_integer_plus(v1, big_integer_plus(v2, p2));
}
相关推荐
We་ct1 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
JAVA面经实录9174 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
周杰伦fans5 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
叼烟扛炮6 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说6 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove7 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung7 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了7 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL7 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化