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

超大数值减法

给定两个超大整数,求它们的差是多少?

 

#include <bits/stdc++.h>

using namespace std;

char a[11000], b[11000]; //被减数和减数

string sub(string sa, string sb) {

    if (sa == sb) return "0"; //特判:两数字相等

    bool neg = 0; //标记是否为负数

    if (sa.size() < sb.size() || sa.size() == sb.size() && sa < sb)

        swap(sa, sb), neg = 1; //让 a 大于 b

    int lena = sa.size(), lenb = sb.size();

    for (int i = 0; i < lena; i++)

        a[lena - 1 - i] = sa[i] - '0'; //把字符转换成数字然后翻转,使 a[0]是最低位

    for (int i = 0; i < lenb; i++)

        b[lenb - 1 - i] = sb[i] - '0';

    int lmax = lena;

    for (int i = 0; i < lmax; i++) {

        a[i] -= b[i];

        if (a[i] < 0) { //处理借位

            a[i] += 10;

            a[i + 1]--;

        }

    }

    while (!a[--lmax] && lmax > 0); //找到首位为 0 的位置,什么都不做

    lmax++;

    string ans;

    for (int i = lmax - 1; i >= 0; i--) //把数字转换成字符,然后翻转

        ans += a[i] + '0';

    if (neg) ans = "-" + ans; //检查是否为负数

    return ans;

}

int main() {
    string sa, sb;

scanf("%s%s",sa,sb);

printf("%s\n",sub(sa,sb));

return 0;

相关文章:

  • 解决论文中字体未嵌入的问题
  • STM32中的SPI通信协议
  • SprigBoot整合rocketmq-v5-client-spring-boot
  • CMake从入门到实战:现代C++项目构建指南
  • Android组件化框架设计与实践
  • Python60日基础学习打卡D35
  • NumPy数组切片
  • 基于AI自动生成测试用例
  • 「OC」源码学习——关联属性再探索
  • leetcode 131. Palindrome Partitioning
  • 【Qt】QCustomPlot相关
  • 2025一带一路暨金砖国家技能发展与技术创新大赛第三届企业信息系统安全赛项
  • 【面板数据】上市公司外资持股数据集(2005-2023年)
  • 防火墙高可用(HA)主备验证实验(eNSP)
  • TTL和死信交换机实现延迟队列
  • 4款顶级磁力下载工具,速度提升器,可以变下变播
  • 第三章 第二大脑的运作机理 整理笔记
  • 套索回归与岭回归通俗讲解
  • TCP建立连接为什么不是两次握手,而是三次,为什么不能在第二次握手时就建立连接?
  • uniapp-商城-68-shop(1-商品列表,获取数据,utils、tofixed 、parseInt的使用)
  • 做同城网站需要哪些/东莞百度搜索网站排名
  • 网站推广意义/自己如何开网站
  • 湖州网站设计公司的别名是/下载一个百度时事新闻
  • 做设计的网站商家入驻/qq推广软件
  • 网站的在线支付模块怎么做/中国联通和腾讯
  • wordpress title标题/郑州关键词优化费用