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

news2025/4/20 5:05:01

大数的(加减乘除)四则运算、阶乘运算。
乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法。

重复了部分 19 课的代码。

1 文本格式

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;

/// <summary>
/// 大数的(加减乘除)四则运算、阶乘运算
/// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法
/// </summary>
public static class BigInteger_Utility
{
    /// <summary>
    /// 记录 加减乘除 的运算次数
    /// </summary>
    public static int[] operations { get; set; } = new int[] { 0, 0, 0, 0 };

    /// <summary>
    /// 《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)
    /// 一般可将超过9位数的数字成为“大数”。
    /// 两个大数之间的四则运算用于密码学、高精度计算等应用。
    /// 位数很多的浮点数可转为大数,再逆转即可。
    /// </summary>
    /// <param name="n"></param>
    /// <returns></returns>
    public static string rand(int n)
    {
        // 随机数发生器
        Random rnd = new Random();
        StringBuilder sb = new StringBuilder();
        // 第一个数字不能为0,故:0-8之间的随机数+ 1 = 1-9
        sb.Append((rnd.Next(9) + 1).ToString());
        // 后面 n-1 个数字为 0-9;从 1 开始计数
        for (int i = 1; i < n; i++)
        {
            sb.Append((rnd.Next(10)).ToString());
        }
        return sb.ToString();
    }

    /// <summary>
    /// 字符串型的数字转为数组
    /// 低位(右)在前,比如 "123" , n=6 存为 3,2,1,_,_,_
    /// n 可能大于 a 的长度;剩余位置留出来用于 进位 等。
    /// </summary>
    /// <param name="a"></param>
    /// <param name="n">最大位数,后面留0</param>
    /// <returns></returns>
    public static int[] string_to_digitals(string a, int n)
    {
        // 字符串 转为 “字符数组”
        char[] c = a.ToCharArray();
        // 存储数字的数组
        int[] d = new int[n];
        // 从最右端(个位)数字开始,转存为数字数组,参与后面的计算
        for (int i = a.Length - 1, j = 0; i >= 0; i--)
        {
            // 跳过数字前面可能有的 - 号
            if (a[i] == '-') continue;
            // '0' 字符是最小的数字字符
            // 数值 = 字符 - '0' ;
            d[j++] = a[i] - '0';
        }
        return d;
    }

    /// <summary>
    /// 数组型数字转为字符串型
    /// 低位(右)在前,比如 3,2,1,_,_,_ 转为 "123", n=6
    /// 这是前面 string_to_digitals 的反向计算函数
    /// n 可能大于 d 的长度;剩余位置留出来用于 进位 等。
    /// </summary>
    /// <param name="d"></param>
    /// <returns></returns>
    public static string digitals_to_string(int[] d)
    {
        int n = d.Length;
        // 数字数组 d 含有一些无效的数组;
        // 因此,先从最右段开始去除无效的位置
        int k = n - 1;
        //for (; (k >= 0) && (d[k] == 0); k--) ;
        while ((k >= 0) && (d[k] == 0)) k--;
        // 找到有效位置后,开始组合字符串;
        if (k >= 0)
        {
            StringBuilder sb = new StringBuilder();
            for (; k >= 0; k--) sb.Append(d[k]);
            return sb.ToString();
        }
        else
        {
            return "0";
        }
    }

    /// <summary>
    /// 《小白学程序》第二十课:大数(BigInteger)的四则运算之一,加法
    /// 大数加法 c = a + b
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    public static string big_integer_plus(string a, string b)
    {
        int n = Math.Max(a.Length, b.Length) + 1;
        // 位数不长的数字直接计算
        if (n <= 18)
        {
            return (ulong.Parse(a) + ulong.Parse(b)).ToString();
        }

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

        // 从低位(右)往高位(左)相加
#if _ORIGINAL__
        for (int i = 0; i < (n - 1); i++)
        {
            da[i] += db[i];
            if (da[i] > 9)
            {
                da[i] -= 10;
                da[i + 1] += 1;
            }
        }
        return digitals_to_string(da);
#else
        int[] dc = new int[n];
        Array.Copy(da, dc, n);
        for (int i = 0; i < (n - 1); i++)
        {
            dc[i] = dc[i] + db[i];
            if (dc[i] > 9)
            {
                dc[i] -= 10;
                dc[i + 1] += 1;
            }
        }
        return digitals_to_string(dc);
#endif

    }
}

2 代码格式

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;

/// <summary>
/// 大数的(加减乘除)四则运算、阶乘运算
/// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法
/// 除法运算为 Truffer 自创算法;
/// </summary>
public static class BigInteger_Utility
{
    /// <summary>
    /// 记录 加减乘除 的运算次数
    /// </summary>
    public static int[] operations { get; set; } = new int[] { 0, 0, 0, 0 };

    /// <summary>
    /// 《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)
    /// 一般可将超过9位数的数字成为“大数”。
    /// 两个大数之间的四则运算用于密码学、高精度计算等应用。
    /// 位数很多的浮点数可转为大数,再逆转即可。
    /// </summary>
    /// <param name="n"></param>
    /// <returns></returns>
    public static string rand(int n)
    {
        // 随机数发生器
        Random rnd = new Random();
        StringBuilder sb = new StringBuilder();
        // 第一个数字不能为0,故:0-8之间的随机数+ 1 = 1-9
        sb.Append((rnd.Next(9) + 1).ToString());
        // 后面 n-1 个数字为 0-9;从 1 开始计数
        for (int i = 1; i < n; i++)
        {
            sb.Append((rnd.Next(10)).ToString());
        }
        return sb.ToString();
    }

    /// <summary>
    /// 字符串型的数字转为数组
    /// 低位(右)在前,比如 "123" , n=6 存为 3,2,1,_,_,_
    /// n 可能大于 a 的长度;剩余位置留出来用于 进位 等。
    /// </summary>
    /// <param name="a"></param>
    /// <param name="n">最大位数,后面留0</param>
    /// <returns></returns>
    public static int[] string_to_digitals(string a, int n)
    {
        // 字符串 转为 “字符数组”
        char[] c = a.ToCharArray();
        // 存储数字的数组
        int[] d = new int[n];
        // 从最右端(个位)数字开始,转存为数字数组,参与后面的计算
        for (int i = a.Length - 1, j = 0; i >= 0; i--)
        {
            // 跳过数字前面可能有的 - 号
            if (a[i] == '-') continue;
            // '0' 字符是最小的数字字符
            // 数值 = 字符 - '0' ;
            d[j++] = a[i] - '0';
        }
        return d;
    }

    /// <summary>
    /// 数组型数字转为字符串型
    /// 低位(右)在前,比如 3,2,1,_,_,_ 转为 "123", n=6
    /// 这是前面 string_to_digitals 的反向计算函数
    /// n 可能大于 d 的长度;剩余位置留出来用于 进位 等。
    /// </summary>
    /// <param name="d"></param>
    /// <returns></returns>
    public static string digitals_to_string(int[] d)
    {
        int n = d.Length;
        // 数字数组 d 含有一些无效的数组;
        // 因此,先从最右段开始去除无效的位置
        int k = n - 1;
        //for (; (k >= 0) && (d[k] == 0); k--) ;
        while ((k >= 0) && (d[k] == 0)) k--;
        // 找到有效位置后,开始组合字符串;
        if (k >= 0)
        {
            StringBuilder sb = new StringBuilder();
            for (; k >= 0; k--) sb.Append(d[k]);
            return sb.ToString();
        }
        else
        {
            return "0";
        }
    }

    /// <summary>
    /// 《小白学程序》第二十课:大数(BigInteger)的四则运算之一,加法
    /// 大数加法 c = a + b
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    public static string big_integer_plus(string a, string b)
    {
        int n = Math.Max(a.Length, b.Length) + 1;
        // 位数不长的数字直接计算
        if (n <= 18)
        {
            return (ulong.Parse(a) + ulong.Parse(b)).ToString();
        }

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

        // 从低位(右)往高位(左)相加
#if _ORIGINAL__
        for (int i = 0; i < (n - 1); i++)
        {
            da[i] += db[i];
            if (da[i] > 9)
            {
                da[i] -= 10;
                da[i + 1] += 1;
            }
        }
        return digitals_to_string(da);
#else
        int[] dc = new int[n];
        Array.Copy(da, dc, n);
        for (int i = 0; i < (n - 1); i++)
        {
            dc[i] = dc[i] + db[i];
            if (dc[i] > 9)
            {
                dc[i] -= 10;
                dc[i + 1] += 1;
            }
        }
        return digitals_to_string(dc);
#endif

    }
}

3 计算结果

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

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

相关文章

网络视频播放卡顿原因分析

一、问题描述 某项目通过拉摄像机rtsp流转rtmp/http-flv/ws-flv的方案&#xff0c;使用户可以在网页中观看摄像机的视频画面。在 观看视频时偶发出现卡顿现象。 二、卡顿现象分析和解决 此问题涉及的原因较多&#xff0c;所以得考虑各环节的问题可能性&#xff0c;并根据现场实…

C语言盐水的故事(ZZULIOJ1214:盐水的故事)

题目描述 挂盐水的时候&#xff0c;如果滴起来有规律&#xff0c;先是滴一滴&#xff0c;停一下&#xff1b;然后滴二滴&#xff0c;停一 下&#xff1b;再滴三滴&#xff0c;停一下...&#xff0c;现在有一个问题&#xff1a;这瓶盐水一共有VUL毫升&#xff0c;每一滴是D毫升&…

黑马点评-Feed流的实现方案,基于推拉结合模式实现笔记推送

Feed流实现方案 我们关注了博主之后,当用户发布了动态后我们应该把这些数据推送给粉丝,关注推送也叫作Feed(投喂)流,通过无限下拉刷新获取新的信息 传统的模式内容检索: 粉丝需要主动通过搜索引擎或者是其他方式去查找想看的内容新型Feed流的效果: 系统分析用户到底想看什么,…

CSDN C4模拟题

《计算机常识》 进制转换 一、任务目标 理解二进制/八进制/十进制/十六进制的原理 掌握各种不同的进制间的转换方法 二、任务背景 进制转换是软件工程师的必备技能,也是C1阶段的计算机通识模块之一,实际开发中的多媒体数据采集、分割、压缩、编解转码、传输、纠错、合并等…

队列详解(C语言实现)

文章目录 写在前面1 队列的定义2 队列的初始化3 数据入队列4 数据出队列5 获取队头元素6 获取队尾元素7 获取队列元素个数8 判断队列是否为空8 队列的销毁 写在前面 本片文章详细介绍了另外两种存储逻辑关系为 “一对一” 的数据结构——栈和队列中的队列&#xff0c;并使用C语…

WorkPlus稳定服务助力行业千万用户,打造无界沟通协作平台

在企业移动数字化领域&#xff0c;WorkPlus以其十年如一日的研发实力和千万级用户案例&#xff0c;成为众多企业首选的移动数字化平台。究竟是什么样的力量支撑着WorkPlus在市场上占据如此重要的地位呢&#xff1f;接下来&#xff0c;让我们一起揭开WorkPlus的神秘面纱&#xf…

【开源】基于Vue.js的陕西非物质文化遗产网站

文末获取源码&#xff0c;项目编号&#xff1a; S 065 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S065。} 文末获取源码&#xff0c;项目编号&#xff1a;S065。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与…

网络唤醒原理浅析(Wake On LAN)

原理 将唤醒魔术包发送的被唤醒机器的网卡上&#xff0c;魔术包指AMD公司开发的唤醒数据包&#xff0c;具有远程唤醒的网卡都支持这个标准&#xff0c;用16进制表示如下&#xff1a; 6对“FF”前缀16次重复MAC地址,举个例子假如我的网卡MAC地址是&#xff1a;AA:BB:CC:DD:EE:…

现代 C++ 函数式编程指南

现代 C 函数式编程指南 什么是 柯里化 &#xff08;Curry&#xff09;什么是 部分应用 &#xff08;Partial Application&#xff09; 二元函数 &#xff08;Partial Application&#xff09;参数排序 &#xff08;Partial Application&#xff09; 应用场景 计算碳衰减周期求年…

Shell脚本:Linux Shell脚本学习指南(第二部分Shell编程)三

第二部分&#xff1a;Shell编程&#xff08;三&#xff09; 二十一、Shell declare和typeset命令&#xff1a;设置变量属性 declare 和 typeset 都是 Shell 内建命令&#xff0c;它们的用法相同&#xff0c;都用来设置变量的属性。不过 typeset 已经被弃用了&#xff0c;建议…

MySql之索引,视图,事务以及存储过程举例详解

一.数据准备 数据准备可参考下面的链接中的数据准备步骤 MySql之内连接&#xff0c;外连接&#xff0c;左连接&#xff0c;右连接以及子查询举例详解-CSDN博客 &#xff08;如有问题可在评论区留言&#xff09; 二.存储过程 1.定义 存储过程 PROCEDURE &#xff0c;也翻译…

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…

过渡曲线的构造之平面PH曲线

平面PH曲线的构造及其相应性质 平面PH曲线的构造及其相应性质PH曲线理论三次PH曲线的构造及性质四次PH曲线的构造及性质五次PH曲线的构造及性质非尖点五次PH曲线尖点五次PH曲线 参考文献 平面PH曲线的构造及其相应性质 过渡曲线常需要满足在连接点处位置连续、曲率连续以及切线…

Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

makefile编写练习

makefile编写练习 OVERVIEW makefile编写练习文件结构直接编译整个项目并运行将项目制作成为静态库将项目制作成为动态库 编写makefile文件来编译带头文件的程序&#xff0c; 文件结构 初始项目文件结构&#xff0c;如下所示&#xff1a; #ifndef ADD_HPP #define ADD_HPPint…

栈详解(C语言)

文章目录 写在前面1 栈的定义2 栈的初始化3 数据入栈4 数据出栈5 获取栈顶元素6 获取栈元素个数7 判断栈是否为空8 栈的销毁 写在前面 本片文章详细介绍了另外两种存储逻辑关系为 “一对一” 的数据结构——栈和队列中的栈&#xff0c;并使用C语言实现了数组栈。 栈C语言实现源…

Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线 本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键&#xff08;事件响应函数&#xff09;&#xff0c;最后实现单一颜色直线的绘制与渐变色直线的绘制o(&#xffe3;▽&#xffe…

2、Burp使用

文章目录 一、为Firefox浏览器安装数字证书二、利用Intruder模块进行暴力破解 一、为Firefox浏览器安装数字证书 &#xff08;1&#xff09;利用Firefox浏览器访问http://burp或127.0.0.1:<监听端口>&#xff0c;点击页面右上侧的“CA Certificate”处下载CA证书&#xf…

靡靡之音 天籁之声 ——Adobe Audition

上一期讲到了和Pr配合使用的字幕插件Arctime Pro的相关介绍。相信还记得的小伙伴应该记得我还提到过一个软件叫做Au。 当人们对字幕需求的逐渐满足&#xff0c;我们便开始追求更高层次的享受&#xff0c;当视觉享受在进步&#xff0c;听觉享受想必也不能被落下&#xff01; Au即…

【模板】KMP算法笔记

练习链接&#xff1a;【模板】KMP - 洛谷 题目&#xff1a; 输入 ABABABC ABA 输出 1 3 0 0 1 思路&#xff1a; 根据题意&#xff0c;用到的是KMP算法&#xff0c;KMP算法思想是通过一个一个匹配首字母的原理进行整个匹配效果&#xff0c;当某个首字母不匹配的时候&#x…