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 (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;

}

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

相关推荐
Amor风信子9 分钟前
华为OD机试真题---跳房子II
java·数据结构·算法
我是陈泽12 分钟前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
优雅的小武先生22 分钟前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
明耀22 分钟前
WPF RadioButton 绑定boolean值
c#·wpf
戊子仲秋26 分钟前
【LeetCode】每日一题 2024_10_2 准时到达的列车最小时速(二分答案)
算法·leetcode·职场和发展
邓校长的编程课堂28 分钟前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法
虽千万人 吾往矣28 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
创作小达人31 分钟前
家政服务|基于springBoot的家政服务平台设计与实现(附项目源码+论文+数据库)
开发语言·python
郭二哈34 分钟前
C++——list
开发语言·c++·list
杨荧35 分钟前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源