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

2023-09-14 09:00:00

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 代码格式

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

更多推荐

睿趣科技:抖音开网店新手卖什么好

随着社交媒体和电子商务的迅猛发展,越来越多的人开始探索在抖音上开网店,希望能够通过这一平台实现创业梦想。但对于新手来说,选择什么产品进行销售可能会是一个困扰。在本文中,我们将探讨一些适合抖音新手的热门产品和一些成功经验,以帮助你在抖音上开设一家成功的网店。潮流服饰:服装和配饰一直是电子商务的热门领域之一。通过在抖音上展

轻量型服务器能支撑多少人访问?

一、服务器配置影响访问人数服务器的配置是影响轻量型服务器能够支撑的访问人数的关键因素之一。通常而言,轻量型服务器的配置普遍不高,适合小型团队或个人使用。如果服务器配置较低,那么支撑访问人数的能力也会受到限制。较为简单的应用程序对服务器性能要求不高,可以支持较多的访问人数。但是,如果应用程序较为复杂,对服务器性能要求较高

9月16日,每日信息差

今天是2023年09月16日,以下是为您准备的15条信息差第一、天猫超市首单“茅小凌”已由菜鸟送达,首单已由菜鸟供应链完成履约,18分钟送达消费者手中第二、软银考虑对OpenAI进行投资。此外,软银还初步拟收购英国人工智能芯片制造商Graphcore第三、我国共有327家网约车平台公司取得经营许可。各地共发放网约车驾驶

行业追踪,2023-09-20

自动复盘2023-09-20凡所有相,皆是虚妄。若见诸相非相,即见如来。k线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让市场来告诉你跟踪板块总结:成交额超过100亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个上级的归类,这样更能体现

C# Math.Round()四舍五入、四舍六入五成双

开发者为了实现小数点后2位的四舍五入,编写了如下代码,varnum=Math.Round(12.125,2);代码非常的简单,开发者实际得到的结果是12.12,这与其所预期的四舍五入结果12.13相悖。其实产生这个结果的原因是由于Math.Round默认使用的并非是四舍五入的原则,而是四舍六入五成双的原则。四舍六入五成

华为HCIA(三)

链路本地地址接口标识64bit当STP端口到了Forwarding状态后,会转发流量,也处理报文在TCP/IP模型中,会话层,表示层和应用层,都规划成了应用层路由表包含目的地址和掩码,优先级,cost,下一跳和出接口。Destination(目的地)protocol(协议)学习进制!!!在NCP协商完成后,PPP保持通

第37章_瑞萨MCU零基础入门系列教程之DAC数模转换模块

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

前端实现PDF预览:简单而高效的方法

前言PDF是一种常用的文件格式,但在网页中直接预览PDF文件可能会带来一些挑战。本文将介绍一种简单而高效的前端方法,以实现PDF文件的预览。使用iframe标签嵌入PDF文件最简单的方法是使用iframe标签来嵌入PDF文件。代码如下所示:<iframesrc="/path/to/pdf/file.pdf"width=

HDMI协议Ver2.0a(学习笔记)

1简介本规范由HDMI论坛制定2.目的和范围本文件构成了高清多媒体接口2.0版规范(HDMI规范2.0版)。本规范通过引用纳入了HDMI规范1.4b版,并定义了附加和改进的功能。对Source、Sink、中继器和电缆的合规性所需的机械、电气、行为和协议要求进行了说明。3.TBD4.TBD5.概述HDMI规范2.0版(本

正则表达式相关概念及不可见高度页面的获取

12.正则概念:匹配有规律的字符串,匹配上则正确1.正则的创建方式构造函数创建//修饰符igm//i忽视ignore//gglobal全球全局//m换行varreg=newRegExp("匹配的内容","修饰符")varstr="thisisaBox";varreg=newRegExp("box","igm");con

win10系统 C++环境 安装编译GRPC

第一步下载源码、更新、cmake编译:为了依赖的成功安装,采用gitee进行下载与更新。记得需要安装git软件。安装命令:在自己指定的目录下,鼠标右键,选择gitBashHere打开命令行gitclone-bv1.34.0https://gitee.com/mirrors/grpc-framework.gitgrpc在

热文推荐