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 计算结果

相关推荐
520拼好饭被践踏3 小时前
JAVA+Agent学习day22
java·开发语言·后端·学习
笨蛋不要掉眼泪4 小时前
Java虚拟机:堆的参数配置
java·开发语言·jvm
冰暮流星4 小时前
javascript之date对象
开发语言·javascript·ecmascript
闪电悠米4 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~4 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
Wang's Blog4 小时前
Go-Zero项目开发17: IM私聊功能实现与消息存储设计
开发语言·后端·golang
Ulyanov4 小时前
Python雷达电子对抗仿真引擎(一):打破单体瓶颈,构建微服务与ECS架构的顶层设计
开发语言·python·微服务·云原生·架构·雷达电子对抗
IT方大同4 小时前
C语言分支与循环语句
c语言·开发语言·算法
长不胖的路人甲5 小时前
斐波那契查找Java 实现 + 完整思路
java·开发语言
待磨的钝刨5 小时前
深入理解主成分分析(PCA)
人工智能·线性代数·算法·机器学习