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

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-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;
        }
    }
}

3 计算结果


http://www.kler.cn/news/150000.html

相关文章:

  • Git_git相关指令 高阶
  • 人工智能原理复习--知识表示(二)
  • Spark local模式的安装部署
  • 【hacker送书第6期】深入理解Java核心技术
  • 什么是计算机病毒?
  • 户外低功耗太阳能板供电无线RTU数据采集支持定时采集各类485接口传感器数据推送数据到第三方平台远程监测系统搭建方案
  • 数据结构算法-分支定界算法
  • 【brpc学习实践四】异步请求案例详解
  • 【分享】Java Helper 与 Utility 类的区别
  • MYSQL基础之【创建数据表,删除数据表】
  • 鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Extend扩展组件样式与stateStyles多态样式(十一)
  • 仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送
  • 【独家OD2023C卷真题】20天拿下华为OD笔试【贪心】2023C-分配土地最大面积【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • 网络运维与网络安全 学习笔记2023.11.29
  • 【计算机毕业设计】nodejs+vue音乐播放器系统 微信小程序83g3s
  • J-Flash工具的使用---擦除、烧录及校验
  • NineData:帮助开发者用好数据和云
  • uniapp上架app store详细攻略
  • 人机交互2——任务型多轮对话的控制和生成
  • vue3+ts+vite 打包报错 TS2304: Cannot find name ‘xxx‘
  • 【Vue3】Vue3引入DataV |BIN-DATAV 开发大屏
  • 初刷leetcode题目(11)——数据结构与算法
  • leetCode 841. 钥匙和房间 图遍历 深度优先遍历+广度优先遍历 + 图解
  • XML映射文件
  • 基于UDP的TFTP文件传输
  • 关于X86机器上运行GnuCobol的研究
  • 【Pytorch】Visualization of Feature Maps(5)——Deep Dream
  • Java常见的面试题(很基础那种)
  • 【Java】泛型的简单使用
  • Leetcode(面试题 08.01.)三步问题