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

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_subtract(string a, string b)
{
int na = a.Length;
int nb = b.Length;
int n = Math.Max(na, nb) + 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 (na > nb ||
((na == nb) && big_integer_compare(da, db) >= 0))
{
// 从低位(右)往高位(左)相减
for (int i = 0; i < na; i++)
{
da[i] -= db[i];
if (da[i] < 0)
{
da[i] += 10;
da[i + 1] -= 1;
}
}
return digitals_to_string(da);
}
else
{
for (int i = 0; i < nb; i++)
{
db[i] -= da[i];
if (db[i] < 0)
{
db[i] += 10;
db[i + 1] -= 1;
}
}
string r = digitals_to_string(db);
return (r == "0") ? r : "-" + r;
}
}
}
2 代码格式
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-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_subtract(string a, string b){int na = a.Length;int nb = b.Length;int n = Math.Max(na, nb) + 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 (na > nb ||((na == nb) && big_integer_compare(da, db) >= 0)){// 从低位(右)往高位(左)相减for (int i = 0; i < na; i++){da[i] -= db[i];if (da[i] < 0){da[i] += 10;da[i + 1] -= 1;}}return digitals_to_string(da);}else{for (int i = 0; i < nb; i++){db[i] -= da[i];if (db[i] < 0){db[i] += 10;db[i + 1] -= 1;}}string r = digitals_to_string(db);return (r == "0") ? r : "-" + r;}}
}
3 计算结果

相关文章:
C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)
1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的(加减乘除)四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…...
HarmonyOS ArkTS Video组件的使用(七)
概述 在手机、平板或是智慧屏这些终端设备上,媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集,还是视频的播放、切换、循环,亦或是相机的预览、拍照等功能,媒体组件都是必不可少的。以视频功能为例&a…...
【深度学习实验】注意力机制(四):点积注意力与缩放点积注意力之比较
文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 理论介绍a. 认知神经学中的注意力b. 注意力机制 1. 注意力权重矩阵可视化(矩阵热图)2. 掩码Softmax 操作3. 打分函数——加性注意力模型3. 打分函数——点积注意力与缩放…...
用于图像分类任务的经典神经网络综述
🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…...
Linux如何查找某个路径下大于1G的文件
find 命令可以用于在 Linux 或 macOS 系统中查找文件和目录。如果你想查找大于1GB的文件,可以使用 -size 选项结合 参数。以下是一个示例: find /path/to/search -type f -size 1G这里的 /path/to/search 是你要搜索的目录的路径。这个命令将查找该目录…...
Java二级医院区域HIS信息管理系统源码(SaaS服务)
一个好的HIS系统,要具有开放性,便于扩展升级,增加新的功能模块,支撑好医院的业务的拓展,而且可以反过来给医院赋能,最终向更多的患者提供更好的服务。 系统采用前后端分离架构,前端由Angular、J…...
自制编程语言(第三弹)定义Token
终于到了激动人心的实现时候了。为了实现我们的自制语言,我们需要的步骤为: 词法分析语法分析语义分析(此处不设置)解释器 详细完整的代码可以点击这里查看github项目。 词法分析: 将代码片段识别为关键词、标识符、…...
linux下的工具---yum
一、什么是yum yum是Linux下的软件包管理器 二、什么是软件包管理器 1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在…...
java全局异常处理(springboot)
介绍: 在日常项目开发中,异常是常见的,但是如何更高效的处理好异常信息,让我们能快速定位到BUG,是很重要的,不仅能够提高我们的开发效率,还能让你代码看上去更舒服,SpringBoot的项目…...
JAVA将PDF转图片
前言 当今时代,PDF 文件已经成为了常用的文档格式。然而,在某些情况下,我们可能需要将 PDF 文件转换为图片格式,以便更方便地分享和使用。这时,我们可以使用 Java 编程语言来实现这个功能。Java 提供了许多库和工具&a…...
合并区间[中等]
一、题目 以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。 示例 1: 输入:intervals […...
MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
文章目录 前言MySQL LIKE 子句在PHP脚本中使用 LIKE 子句 MySQL NULL 值处理在命令提示符中使用 NULL 值使用PHP脚本处理 NULL 值 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱👓博主在前端领域还有…...
线索二叉树:C++实现
引言: 线索二叉树是一种特殊的二叉树,它可以通过线索(线索是指在二叉树中将空指针改为指向前驱或后继的指针)的方式将二叉树转化为一个线性结构,从而方便对二叉树进行遍历。本文将介绍如何使用C实现线索二叉树。 技术…...
C++——vector互换容器与预留空间
一.vector互换容器 功能描述:实现两个容器内元进行互换 函数原型: swap(vec); //将vec与本身的元素互换 实例: //1.基本使用 void test01() {vector<int>v1;for (int i 0; i < 10; i){v1.push_back(i);}cout << "交换前:" << e…...
Unity 自带的一些可以操控时间的属性或方法。
今天来总结下Unity自带的一些可以操控时间的方法。 1、Time.time。比较常用计算运行时间而触发特定事件。 public class Controller : MonoBehaviour {public float eventTime 5f; // 触发事件的时间private float startTime; // 游戏开始的时间private void Start(){startT…...
vue 项目中使用 mqtt
1、在html 中用cdn方式引入 <script src"https://unpkg.com/mqtt/dist/mqtt.min.js"></script> 2、封装代码 mqtt_connect.js // import * as mqtt from mqtt/dist/mqtt.min // 不知道为什么 我用引入的方式不成,就在html 用的cdn方式接入了…...
linux shell操作 - 05 进程 与 IO 模型
文章目录 计算机内存分配进程与子进程流IO模型非阻塞IOIO多路复用网络IO模型简单的socket并发的socket 计算机内存分配 一个32位,4G内存的计算机,内存使用分为两部分: 操作系统内核空间;应用程序的用户空间使用的操作系统不同&a…...
让SOME/IP运转起来——SOME/IP系统设计(下)之数据库开发
上一篇我们介绍了SOME/IP矩阵的设计流程,这一篇重点介绍如何把SOME/IP矩阵顺利的交给下游软件团队进行开发。 车载以太网通信矩阵开发完成后,下一步应该做什么? 当我们完成SOME/IP矩阵开发,下一步需要把开发完成的矩阵换成固定格…...
Mybatis反射工厂类DefaultReflectorFactory
DefaultReflectorFactory是反射工厂接口ReflectorFactory的默认实现,其主要是实现了对反射对象Reflector的创建和缓存。 有三个方法: // 判断是否开启缓存boolean isClassCacheEnabled();// 设置是否缓存void setClassCacheEnabled(boolean classCacheEn…...
antDesignPro a-table样式二次封装
antDesignPro是跟element-ui类似的一个样式框架,其本身就是一个完整的后台系统,风格样式都很统一。我使用的是antd pro vue,版本是1.7.8。公司要求使用这个框架,但是UI又有自己的一套设计。这就导致我需要对部分组件进行一定的个性…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
