C#,《小白学程序》第二十三课:大数的除法(BigInteger Divide)

1 文本格式

/// <summary>

/// 比较a,b的大小,返回1,0,-1

/// 数据从低位(右)往高位(左)存储;

/// </summary>

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

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

/// <returns></returns>

public static int big_integer_compare(int\[\] a, int\[\] b)

{

for (int i = a.Length - 1; i >= 0; i--)

{

if (ai > bi) return 1;

else if (ai < bi) return -1;

}

//两位数相等

return 0;

}

/// <summary>

/// 《小白学程序》第二十三课:大数(BigInteger)的四则运算之四,除法

/// 大数除法 c = a / b % d

/// c 为商,d 为余数。

/// 网上常见的除法算法是:用"被除数"不断地减去"除数",减去的"次数"就是商,剩下的就是余数。

/// 这当然很慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢

/// 本文发布的是纯加、减法实现的 Truffer 大数除法。

/// Truffer 大数除法的核心思想是按两个数的位数差距,估算一个倍数,比如10000,再进行减法计算;

/// 以此类推计算剩余的数字。

/// </summary>

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

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

/// <param name="d">余数</param>

/// <returns>商c</returns>

public static string big_integer_divide(string a, string b, out string d)

{

int n = a.Length;

int\[\] db = string_to_digitals(b, n);

string q = a;

List<string> p = new List<string>();

int\[\] dq = string_to_digitals(q, n);

while (big_integer_compare(dq, db) >= 0)

{

// 按相差的位数构造 100... 这样的倍数,作为 被减的数的倍数。

int len = q.Length - b.Length;

// 被减数 = 倍数 * 除数

string v2 = b + String.Join("", new intlen);

int\[\] dv = string_to_digitals(v2, n);

// 如果当前数与被减数长度系统,调整倍数

if (big_integer_compare(dq, dv) < 0)

{

len--;

v2 = b + String.Join("", new intlen);

dv = string_to_digitals(v2, n);

}

// 每次减去一次被减数,并记录倍数;

string v1 = "1" + String.Join("", new intlen);

while (big_integer_compare(dq, dv) >= 0)

{

p.Add(v1);

q = big_integer_subtract(q, v2);

dq = string_to_digitals(q, n);

}

}

// 最后剩下的就是 余数!

d = q;

// 记录的 被减倍数 之和就是 商

string r = p0;

for (int i = 1; i < p.Count; i++)

{

r = big_integer_plus(r, pi);

}

return r;

}

2 代码格式

cs 复制代码
/// <summary>
/// 比较a,b的大小,返回1,0,-1
/// 数据从低位(右)往高位(左)存储;
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static int big_integer_compare(int[] a, int[] b)
{
    for (int i = a.Length - 1; i >= 0; i--)
    {
        if (a[i] > b[i]) return 1;
        else if (a[i] < b[i]) return -1;
    }
    //两位数相等
    return 0;
}

/// <summary>
/// 《小白学程序》第二十三课:大数(BigInteger)的四则运算之四,除法
/// 大数除法 c = a / b % d
/// c 为商,d 为余数。
/// 网上常见的除法算法是:用"被除数"不断地减去"除数",减去的"次数"就是商,剩下的就是余数。
/// 这当然很慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢
/// 本文发布的是纯加、减法实现的 Truffer 大数除法。
/// Truffer 大数除法的核心思想是按两个数的位数差距,估算一个倍数,比如10000,再进行减法计算;
/// 以此类推计算剩余的数字。
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="d">余数</param>
/// <returns>商c</returns>
public static string big_integer_divide(string a, string b, out string d)
{
    int n = a.Length;
    int[] db = string_to_digitals(b, n);

    string q = a;
    List<string> p = new List<string>();
    int[] dq = string_to_digitals(q, n);
    while (big_integer_compare(dq, db) >= 0)
    {
        // 按相差的位数构造 100... 这样的倍数,作为 被减的数的倍数。
        int len = q.Length - b.Length;
        // 被减数 = 倍数 * 除数
        string v2 = b + String.Join("", new int[len]);
        int[] dv = string_to_digitals(v2, n);
        // 如果当前数与被减数长度系统,调整倍数
        if (big_integer_compare(dq, dv) < 0)
        {
            len--;
            v2 = b + String.Join("", new int[len]);
            dv = string_to_digitals(v2, n);
        }

        // 每次减去一次被减数,并记录倍数;
        string v1 = "1" + String.Join("", new int[len]);
        while (big_integer_compare(dq, dv) >= 0)
        {
            p.Add(v1);
            q = big_integer_subtract(q, v2);
            dq = string_to_digitals(q, n);
        }
    }

    // 最后剩下的就是 余数!
    d = q;

    // 记录的 被减倍数 之和就是 商
    string r = p[0];
    for (int i = 1; i < p.Count; i++)
    {
        r = big_integer_plus(r, p[i]);
    }
    return r;
}

3 计算结果

相关推荐
HugoStudio_SWAN5 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
葡萄城技术团队5 小时前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei5 小时前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟5 小时前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
一晌小贪欢5 小时前
python-第27天:Python面向对象详解
开发语言·python·数据可视化·面向对象·python办公
青 春 记 忆5 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
迪康Defender6 小时前
公用电脑责任追溯难?迪康端点安全一体化管理系统用户模式详解
java·运维·开发语言·网络·其他·安全
阳明山水6 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
16月6日-晴6 小时前
Java面向对象——接口
java·开发语言
桐盛科技7 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算