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

news2024/11/26 13:38: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 计算结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux(下)

一、 对netstat的补充 1.进程管理 在杀死进程时&#xff0c;不可以杀死其他用户的进程。 查看指定进程时&#xff0c;下图的第二行 是ps -ef | grep tail 命令执行的进程 kill -9 进程号 也可以写作 kill -s 9 进程号 机器人&#xff1a; 2.查看主机状态 将进程的信息分三…

使用新版Maven-mvnd快速构建项目

目前我们项目的构建方式多数是 maven、gradle&#xff0c;但是 maven 相对 gradle 来说&#xff0c;构建速度较慢&#xff0c;特别是模块相对较多的时候&#xff0c;构建速度更加明显。但是我们将项目由 maven 替换为 gradle 相对来说会比较麻烦&#xff0c;成本较高。于是我们…

文章生成器免费版

你是否曾经陷入文案创作的困扰中&#xff1f;是不是为了撰写出优质的文章而煞费苦心&#xff1f;那么&#xff0c;如果我告诉你&#xff0c;现在有一种神奇的工具&#xff0c;可以为你解决这个问题&#xff0c;让你轻松地生成文章&#xff0c;你会不会感到兴奋呢&#xff1f;让…

惊艳时装界!AIGC风暴来袭,从设计到生产的全新体验

时尚是一个不断演进的领域&#xff0c;充满创新和独创性&#xff0c;但现在&#xff0c;创新迈入了一个崭新的境界——人工智能生成内容&#xff08;AIGC&#xff09;。这个革命性的技术&#xff0c;改变了时装设计的游戏规则。在过去的几年里&#xff0c;人工智能已经深刻地改…

关于时空数据的培训 GAN:实用指南(第 02/3 部分)

一、说明 在本系列关于训练 GAN 实用指南的第 1 部分中&#xff0c;我们讨论了 a&#xff09; 鉴别器 &#xff08;D&#xff09; 和生成器 &#xff08;G&#xff09; 训练之间的不平衡如何导致模式崩溃和由于梯度消失而导致静音学习&#xff0c;以及 b&#xff09; GAN 对超参…

C 编译原理

C 编译原理 目录 C 编译原理引入GCC 工具链介绍C运行库 编译准备工作编译过程1.预处理2.编译3.汇编4.链接 分析ELF文件1.ELF文件的段2.反汇编ELF C语言编译过程 - 摘录编译预处理编译、优化汇编链接过程 引入 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高…

【80天学习完《深入理解计算机系统》】第十六天 4.2 Y86-64的顺序实现

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Spring Boot的优点及项目创建

Spring Boot优点 起步依赖&#xff08;创建的时候就可以方便的添加依赖&#xff09;内置了Tomcat容器快速部署&#xff0c;使用jar包加上简单的命令直接运行抛弃XML的配置方式提供了更多的监控框架&#xff0c;方便的监控系统运行 Spring Boot项目的创建 准备工作 1.如果ID…

Linux常用命令 - 简单命令

简单命令 who 功能&#xff1a;列出所有正在使用系统的用户相关信息。 who who am i whoamidate 功能&#xff1a;显示或者设置系统的日期和时间。 date date -s 12:3:3cal 功能&#xff1a;显示日历。 cal cal 2023 cal 9 2023clear 功能&#xff1a;清除屏幕上的信息…

浙工大MBA常规批复试建议怎么准备?

如果你第一志愿报考浙江工业大学MBA项目不想被无故的淘汰&#xff0c;小编建议你还是认真对待考后的复试环节。因为从2023年的招生录取可以看到&#xff0c;浙工大MBA项目的提前批面试对于最终录取几乎是没什么作用的&#xff0c;在与普通考生同层次竞争的局面下&#xff0c;复…

高压放大器的特点及应用领域有哪些

高压放大器是一种用于增强输入信号的电压的设备&#xff0c;具有许多独特的特点和广泛的应用领域。下面西安安泰将详细介绍高压放大器的特点以及其在各个领域的应用。 高压放大器的特点&#xff1a; 高增益&#xff1a;高压放大器能够提供高增益&#xff0c;即输入信号经过放大…

redis深度历险 1 - Redis基础数据结构-001

Redis有5种基础数据结构&#xff0c;分别为: string (字符串)、list(列表)、set (集合)、hash (哈希&#xff09;和zset (有序集合)。熟练掌握这5种基本数据结构的使用是Redis 知识最基础也最重要的部分&#xff0c;它也是在 Redis面试题中问到最多的内容。 1 字符串 string …

css实现内凹圆

css实现内凹圆 实现效果 html <div id"post-form"><div class"formbox"></div><div class"rightform"></div> </div>css 样式 #post-form{padding:50px 10px;background:#fff;margin:30px auto;width:9…

vue3+element-plus权限控制实现(el-tree父子级不关联情况处理)

文章目录 前言一、遇到的交互场景el-tree 中 check-strictly 属性 二、处理父级的半选中以及选中交互el-treecheck&#xff0c;check-change 事件编辑进来&#xff0c;父级的半选状态处理 总结 前言 在开发后台管理系统的时候&#xff0c;用户的权限控制是一个常见的需求。这里…

NLP中的文本分类、实体识别、关系识别和三元组识别

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类、实体识别、关系识别和三元组识别是重要的主题。本文将深入探讨这些关键问题&#xff0c;并介绍相关算法和技术。 文本分类 首先&#xff0c;我们关注文本分类。不同的文本分类算法和技术被详细介绍&…

事务隔离级别是怎么实现的?

事务有哪些特性&#xff1f; 事务是由 MySQL 的引擎实现的&#xff0c;我们常见的 InnoDB引擎时支持事务的。 不过并不是所有的引擎都支持事务&#xff0c;比如 MySQL原生的 MyISAM 引擎就不支持事务&#xff0c;正因为如此&#xff0c;大多数MySQL的引擎都是用 InnoDB。 事…

Docker进阶:Docker轻量级可视化工具Portainer与容器监控3剑客CAdvisor+InfluxDB+Granfana

Docker进阶&#xff1a;Docker轻量级可视化工具Portainer与容器监控3剑客CAdvisorInfluxDBGranfana 一、Docker轻量级可视化工具Portainer1.1、Portainer简介1.2、安装Portainer1.2.1、安装Portainer的Docker镜像1.2.2、访问Portainer Web界面1.2.3、连接到Docker守护进程 1.3、…

SpringBoot整合Zookeeper做分布式锁

环境准备 zookeeper准备 首先你需要一个zookeeper服务器&#xff0c;或者是一个zookeeper集群。我已经准备好了一个zookeeper集群&#xff0c;如图&#xff1a; 当然一个单节点的zookeeper也可以搭建分布式锁。如果你还没有zookeeper&#xff0c;那么你可以参考我写的搭建z…

华为云云耀云服务器L实例评测|轻量级应用服务器对决:基于 Geekbench 深度测评华为云云耀云服务器L实例

本文收录在专栏&#xff1a;#云计算入门与实践 - 华为云 专栏中&#xff0c;本系列博文还在更新中 相关华为云云耀云服务器L实例评测文章列表如下&#xff1a; 华为云云耀云服务器L实例评测 | 从零开始&#xff1a;云耀云服务器L实例的全面使用解析指南 华为云云耀云服务器L实…

某计费管理系统任意文件读取漏洞

文章目录 声明一、漏洞描述二、漏洞复现声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、漏洞描述 蓝海…