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

洛谷 P2142 高精度减法(详解)c++

题目链接:P2142 高精度减法 - 洛谷

1.题目  

2.算法原理

解法:模拟列竖式计算的过程

  1. 先用字符串读入,然后拆分每一位,逆序放进数组中
  2. 利用数组,模拟列竖式减法的过程

在这两步之前要多加一步,在模拟解法的过程,一定是一个较大的数减去较小的数,如果是较小的数减较大的数,列竖式计算过程会出错的,如果这道题给的是99-123,此时要把它转换成123-99,在最终输出结果之前先输出一个负号就可以了,所以我们要先处理一个情况,先比较大小,然后用较大的数减去较小的数

有一个问题,题目给的这两个数是用字符串来存的,如果直接用字符串比较大小肯定出错,它涉及字典序vs数的大小的问题,此时有两个数101和99,如果是数的话, 101一定大于99 ,但字符串就不一定了,最终比较结果是99大于101,因为比较字符串的时候是按照字典序来比较的,它的比较方式是我管你这串字符串的长度是多少,直接从最高位开始比较,‘9’这个字符是大于‘1’字符的,所以99字符大于101字符串,这不是我们想要的,处理这种情况,可以在用字符串比较之前,先比较一下长度,长度较长的数一定是大的,如果两个字符串长度相等,再按照字典序的方式来比较就可以了

 还有如果是997-996,结果等于1,因为前导0是要把它删掉的,但此时lc的长度等于3,lc原本指向-1,把前导0去掉后,lc应该指向下标2,所以我们可以判断下lc-1这个位置如果是0,就让lc- -,当他下一个位置是1的时候,让他停下就可以;还有一种情况,如果是999-999,最终的结果是000,lc下标2的时候,lc-1的位置还是0,就不能再减了,因为你最低限度这里面是要存一个0的,所以lc- -的时候要判断一下,lc大于1的时候再去- -,因为lc如果等于1的话,这里即使只剩一个0,lc也不能再减了

代码:

#include <iostream>
using namespace std;

const int N = 1e6 + 10;
int a[N], b[N], c[N];
int la, lb, lc; //分别标记abc数组长度

// 高精度加法的模版 - c = a + b;
void add(int c[], int a[], int b[])
{
    for (int i = 0; i < lc; i++)
    {
        c[i] += a[i] + b[i]; // 对应位相加,再加上进位 9+4=13
        c[i + 1] += c[i] / 10; // 处理进位 13/10=1
        c[i] %= 10; // 处理余数 13%10=3
    }

    if (c[lc]) lc++;
}

int main()
{
    string x, y; cin >> x >> y;

    // 1. 拆分每一位,逆序放在数组中
    la = x.size(); lb = y.size(); lc = max(la, lb);
    for (int i = 0; i < la; i++) a[la - 1 - i] = x[i] - '0';
    for (int i = 0; i < lb; i++) b[lb - 1 - i] = y[i] - '0';

    // 2. 模拟加法的过程
    add(c, a, b); // c = a + b

    // 输出结果
    for (int i = lc - 1; i >= 0; i--) cout << c[i];

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

相关文章:

  • CSS Overflow 属性详解
  • C语言---猜数字游戏
  • Python Web应用开发之Flask框架——基础
  • 【第12节】C++设计模式(结构型模式)-Proxy(代理)模式
  • 第二章、python常用数据结构(2.3.1-2.4)------容器类型与容器类型的关系、数据类型与数据结构的关系
  • 3d投影到2d python opencv
  • 学习路程十三 结合之前所学进行 检索增强生成 实战
  • vuex中的state是响应式的吗?
  • 【每日论文】How far can we go with ImageNet for Text-to-Image generation?
  • 深度学习---卷积神经网络
  • 解锁Egg.js:从Node.js小白到Web开发高手的进阶之路
  • Vite:现代前端构建工具的新选择
  • 深入解析 MySQL 中的时间函数:NOW() 与 SYSDATE() 的奥秘
  • FPGA 配置原理
  • 计算机毕业设计SpringBoot+Vue.js工作流程管理系统(源码+文档+PPT+讲解)
  • 【大模型基础_毛玉仁】0.概述
  • 解决 uView-UI和uv-ui 中 u-tabs 组件在微信小程序中出现横向滚动条的问题
  • 【机器学习】逻辑回归
  • 前缀和算法
  • 【车规芯片】如何引导时钟树生长方向
  • 【STM32】玩转IIC之驱动MPU6050及姿态解算
  • c语言笔记 指针篇(上)
  • 8.1.STM32_OLED
  • Java实现大数据量导出报表
  • Select 下拉菜单选项分组
  • 面试基础----Spring Cloud 微服务架构中的熔断降级:Hystrix 与 Resilience4j 解析
  • 以影像技术重构智能座舱体验,开启驾乘互动新纪元
  • RK3588V2--ES8388声卡适配记录
  • Leetcode---209长度最小子数组
  • 代码贴——堆(二叉树)数据结构