当前位置: 首页 > news >正文

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

大数的(加减乘除)四则运算、阶乘运算。
乘法计算包括小学生算法、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-9sb.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);
#elseint[] 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 计算结果

相关文章:

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

大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算。 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法。 重复了部分 19 课的代码。 1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary>…...

通用功能——git 攻略

摘要 本文主要介绍git常用命令的使用方法&#xff0c;同时介绍一些常见问题的处理方法&#xff0c;持续更新中… git命令通用选项 大多数git命令都适用的选项列表如下&#xff1a; -v, --verbose show hash and subject, give twice for upstream branch -q, --quie…...

LemMinX-Maven:帮助在eclipse中更方便地编辑maven的pom文件

LemMinX-Maven&#xff1a;https://github.com/eclipse/lemminx-maven LemMinX-Maven可以帮助我们在eclipse中更方便地编辑maven工程的pom.xml文件&#xff0c;例如补全、提示等。不用单独安装&#xff0c;因为在安装maven eclipse插件的时候已经自动安装了&#xff1a; 例…...

CAD与 PDM系统如何协同工作的?

在产品研发中&#xff0c;CAD&#xff08;计算机辅助设计&#xff09;和PDM&#xff08;产品数据管理&#xff09;是两个核心的工具&#xff0c;它们在产品从设计到制造的整个生命周期中发挥着重要的作用。虽然这两个工具在功能上有所不同&#xff0c;但它们在使用上却有着密切…...

vue-历史模式部署

项目部署 本项目采用nginx进行部署&#xff0c;历史模式的部署需要服务端的配合&#xff0c;本次采用nginx进行配合。 1 配置 const basePath process.env.VUE_APP_BASE_PATH; module.exports {publicPath: basePath #静态资源的路径 /ecology/ }2 创建路由 const createR…...

『Linux升级路』基础开发工具——make/Makefile

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、认识make/Makefile &#x1f4d2;1.1make/Makefile的优点 &#x1f4d2;…...

Python开发技能实战-如何在Visio中添加和删除任意连接点?

问题 在学习或者工作中&#xff0c;我们经常会借助Visio这个软件绘制流程图&#xff0c;在Visio中一般连接点是固定的&#xff0c;固定的连接点只能绘制一条连接线&#xff0c;如下图所示&#xff1a; 但有时候我们需要在两个方框之间绘制双向连接线&#xff0c;达到以下的效果…...

中科驭数受邀出席2023 ODCC冬季全会,共谋开放数据中心创新发展

近日&#xff0c;2023年开放数据中心委员会&#xff08;简称“ODCC”&#xff09;冬季全会在宁夏银川成功召开&#xff0c;中科驭数作为ODCC的新成员单位&#xff0c;受邀出席本次重要会议。 ▲ 中科驭数正式加入ODCC开放数据中心委员会 开放数据中心委员会是在中国通信标准化…...

Leetcode—907.子数组的最小值之和【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—907.子数组的最小值之和 算法思想 参考自y神思想 实现代码 class Solution { public:int sumSubarrayMins(vector<int>& arr) {long long ans 0;const int mod 1e97;int n arr.size();stack<int>…...

下载文件并重命名

//下载文件并重命名 // 无需数字化归档模版下载 function nodigitalMeth(){ let filenameunescape("/projectapp/ghsjy/template/noNeedDigital.docx")//原文件为英文名字 downloadFileRename(filename,"无需成果数据汇交模版") } // 需要数字化归档模版下…...

BGP路由的选路综合实验

题目要求 1.使用PreVal策略&#xff0c;确保R1通过R3到达192.168.10.0/24 2.使用AS_Path策略&#xff0c;确保R1通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R1通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保R4通过R2到达192.168.1.0/24…...

英语语法:连词or, and, if, unless怎么用?

连词or, and, if, unless怎么用&#xff1f;1. or conj. 或者&#xff0c;还是&#xff0c; 和&#xff0c; 否则用法&#xff1a;并列连词①当“或者&#xff0c;还是”讲时&#xff0c;用在选择疑问句中&#xff0c;是选择疑问句的标志例&#xff1a;Are you a teacher or a …...

基于Spring、SpringMVC、MyBatis的闪烁物业管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的闪烁物业管理系统,java项目。 …...

uni-app 离线打包安卓Apk(小白上手)

场景&#xff1a; 在使用uni-app 开发apk时&#xff0c;使用云打包有次数限制。尤其对于测试阶段是无比难受的&#xff0c;通常是浪费打包次数进行打包或者通过usb 给测试机更新开发环境&#xff0c;但这都是无比漫长的过程 尤其有多个测试机真的是噩梦般的存在 下载离线打包示…...

fatal: refusing to merge unrelated histories報錯咋辦

在 Git 中&#xff0c;如果要合并两个分支&#xff0c;而这两个分支的历史记录不相交&#xff0c;就会出现错误&#xff1a;fatal: refusing to merge unrelated histories。 要解决这个问题&#xff0c;有以下几种方法&#xff1a; 首先&#xff0c;检查一下你正在合并的两个…...

第二十二章 解读pycocotools的API,目标检测mAP的计算COCO的评价指标(工具)

Pycocotools介绍 为使用户更好地使用 COCO数据集, COCO 提供了各种 API。COCO是一个大型的图像数据集&#xff0c;用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi&#xff0c;这些api有助于在COCO中加载、解析和可视化注释。 …...

如何避免光模块接口受到污染?

光模块作为光通信领域一个重要的配件&#xff0c;实现光电和电光的转换&#xff0c;和光纤连接&#xff0c;承载了数据流量的快速转换与传输。因而在整个网络体系中&#xff0c;起着至关重要的作用。虽然光模块在使用过程中&#xff0c;不像交换机和服务器等网络设备一样需要经…...

虚拟机系列:Oracle VM VirtualBox虚拟机的使用教程和使用体验情况反馈

Oracle VM VirtualBox虚拟机的使用教程和使用体验情况反馈 一. 简述:二. 下载三. 安装解压后选择需要的版本点击安装1:第一步,点击安装,点击下一步2. 这里直接点击下一步,3. 网络警告选择:是4. 准备好以后,点击安装5. 点击完成即可四. 打开五. 创建虚拟机1. 输入虚拟机名…...

echarts 通用线性渐变堆叠面积图

echarts 通用线性渐变堆叠面积图 getLineData2() {const myChart echarts.init(this.$refs.chartDom);const option {tooltip: {trigger: axis,},legend: {show: false,textStyle: {fontSize: 14, //字体大小color: #ffffff, //字体颜色},data: [AAA, BBB],},grid: {show: tr…...

在云服务器上搭建个人版chatGPT及后端Spring Boot集成chat GPT

原创/朱季谦 本文分成两部分&#xff0c;包括【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】。 无论是在【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】&#xff0c;两个方式都需要魔法访问&#xff0c;否则是无法正常使用的&#xff0c;即…...

Wan2.1模型实测:用TurboDiffusion快速生成电商产品展示视频

Wan2.1模型实测&#xff1a;用TurboDiffusion快速生成电商产品展示视频 1. 引言&#xff1a;当电商遇上秒级视频生成 想象一下这个场景&#xff1a;你是一家电商公司的运营&#xff0c;明天就要上架一款新产品&#xff0c;需要制作10个不同风格、不同角度的产品展示视频。按照…...

如何快速掌握微信自动化:3步终极解决方案

如何快速掌握微信自动化&#xff1a;3步终极解决方案 【免费下载链接】wxhelper Hook WeChat / 微信逆向 项目地址: https://gitcode.com/gh_mirrors/wx/wxhelper 想要实现PC端微信的自动化操作吗&#xff1f;wxhelper为你提供了完整的微信Hook解决方案&#xff0c;让你…...

如何在不影响员工效率的前提下,彻底杜绝Web威胁?

在数字化转型的浪潮中&#xff0c;浏览器早已从一个简单的网页浏览工具&#xff0c;演变为企业业务运转的核心枢纽。无论是访问云应用、处理内部系统&#xff0c;还是与客户协作&#xff0c;几乎每项工作都离不开它。然而&#xff0c;正是这种无处不在的依赖&#xff0c;让浏览…...

Simple Live:跨平台直播聚合终极指南,告别多App切换烦恼

Simple Live&#xff1a;跨平台直播聚合终极指南&#xff0c;告别多App切换烦恼 【免费下载链接】dart_simple_live 简简单单的看直播 项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live 还在为看直播需要安装多个App而烦恼吗&#xff1f;Simple Live…...

如何利用Bebas Neue字体提升设计项目的视觉冲击力:完整实战指南

如何利用Bebas Neue字体提升设计项目的视觉冲击力&#xff1a;完整实战指南 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 你是否曾经在设计海报、网站标题或品牌标识时&#xff0c;为了找到一款既有现代感又足…...

macOS资源下载完全指南:从入门到精通的网络资源嗅探解决方案

macOS资源下载完全指南&#xff1a;从入门到精通的网络资源嗅探解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 网络…...

若依3.8.6项目里,@RateLimiter注解报‘服务器限流异常’?别慌,手把手教你修复这个Redis坑

若依3.8.6项目中RateLimiter注解的Redis限流异常深度解析与修复实战 当你正在使用若依框架开发一个需要接口限流的功能时&#xff0c;突然在测试环境遇到RateLimiter注解抛出"服务器限流异常"的错误&#xff0c;而Redis服务明明运行正常——这种看似矛盾的场景往往让…...

复古设备新生:树莓派运行OpenClaw轻量版+Phi-3-vision服务

复古设备新生&#xff1a;树莓派运行OpenClaw轻量版Phi-3-vision服务 1. 为什么要在树莓派上折腾OpenClaw&#xff1f; 去年收拾书房时&#xff0c;我在抽屉深处发现了吃灰多年的树莓派4B。这块曾经风靡极客圈的小板子&#xff0c;如今性能早已被现代硬件碾压。但当我看到Ope…...

一文搞懂RAG分块技术:提升大模型准确性的关键(建议收藏)

文本分块&#xff08;Chunking&#xff09;是决定 RAG&#xff08;检索增强生成&#xff09;系统成败的核心技术之一&#xff0c;却常常在幕后默默发挥作用。简单来说&#xff0c;分块就是把长文档切分成更小、结构化的片段&#xff0c;让 AI 系统能够真正检索和推理。 分块可以…...

Notepad++ 插件构想:集成Phi-4-mini-reasoning实现轻量级代码智能

Notepad 插件构想&#xff1a;集成Phi-4-mini-reasoning实现轻量级代码智能 1. 为什么Notepad需要AI插件 作为一个经典的轻量级文本编辑器&#xff0c;Notepad凭借其简洁高效的特点赢得了全球开发者的喜爱。但随着AI技术的快速发展&#xff0c;传统编辑器在代码智能辅助方面的…...