首页 > 其他分享 >高精度减法

高精度减法

时间:2023-10-13 22:36:17浏览次数:38  
标签:10 return 高精度 int back vector 减法 size

一、算法描述

要实现两个高精度数的减法,和高精度加法一样都是模拟竖式计算的过程,主要就是解决以下两个问题。

谁大谁小?

由于这两个数字都很大,但是不知道谁更大,所以要先判断哪个数更大,思路如下:

  • 判断这两个数谁的位数更大,位数更大的自然更大。

  • 如果位数不相同,从最高位开始往低位遍历,判断两个数字是否相等,更大的那个原本的数字也更大。

  • 如果都一样,即默认是前面一个数更大,并不影响后面的操作。

代码如下:

bool cmp(vector<int> &A, vector<int> &B)
{
    if (A.size() != B.size())   return A.size() > B.size();
    else
        for (int i = A.size() - 1; i >= 0; --i)
            if (A[i] != B[i])
                return A[i] > B[i];
    return true;
}

如何计算?

解决了正负问题,现在来解决如何实现大数减小数。

  • 这依然是一个模拟问题,思考如何列竖式计算两个数的减法。

  • 从小到大遍历第一个数(第一个数不小),t += A[i],如果第二个数在当前位数还有数,减去该数,t -= B[i],还有别忘了处理前一位计算可能产生的借位。

  • 将计算结果加入到答案数组中,由于t有两种情况,t >= 0 || t < 0,所以可以统一处理:(t + 10) % 10

  • t < 0时,就是产生了借位,令t = -1,方便下一轮处理,否则令t = 0表示没有产生借位。

  • 最后还需要注意,如果两个数差距非常小,即最后的结果产生了很多前导 \(0\) ,此时我们需要消除,因为输出的时候不需要这些前导 \(0\)。

  • 但是也要注意如果两个数相等,那么最后的结果是 \(0\) ,要保留最后一个 \(0\)。

经过优化之后代码如下:

vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    int t = 0;
    
    for (int i = 0; i < A.size(); ++i)
    {
        t += A[i];
        if (i < B.size())   t -= B[i];
        
        C.push_back((t + 10) % 10);
        if (t < 0)  t = -1;
        else    t = 0;
    }
    while (C.size() > 1 && C.back() == 0)   C.pop_back();
    
    return C;
}

说明:

  • \(|A| + |B|\)可以转化为 \(A + B、A - B、B - A、-(A + B)\) 这四种情况,都是可以用高精度加减法解决的,只需要特殊处理一下输入即可,所以当前讨论的都是正整数。

二、题目描述

给定两个正整数(不含前导 \(0\) ),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

\(1≤整数长度≤10^5\)

输入样例:

32
11 

输出样例:

21 

三、题目来源

AcWing算法基础课-792.高精度减法

四、源代码

#include <iostream>
#include <vector>

using namespace std;

const int N = 100010;

bool cmp(vector<int> &A, vector<int> &B)
{
    if (A.size() != B.size())   return A.size() > B.size();
    else
        for (int i = A.size() - 1; i >= 0; --i)
            if (A[i] != B[i])
                return A[i] > B[i];
    
    return true;
}

vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    int t = 0;
    
    for (int i = 0; i < A.size(); ++i)
    {
        t += A[i];
        if (i < B.size())   t -= B[i];
        
        C.push_back((t + 10) % 10);
        if (t < 0)  t = -1;
        else    t = 0;
    }
    while (C.size() > 1 && C.back() == 0)   C.pop_back();
    
    return C;
}

int main()
{
    string a, b;
    cin >> a >> b;
    
    vector<int> A, B;
    for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');
    for (int i = b.size() - 1; i >= 0; --i) B.push_back(b[i] - '0');
    
    vector<int> C;
    if (cmp(A, B))  C = sub(A, B);
    else
    {
        cout << "-";
        C = sub(B, A);
    }
    
    for (int i = C.size() - 1; i >= 0; --i) cout << C[i];
    
    return 0;
}

标签:10,return,高精度,int,back,vector,减法,size
From: https://www.cnblogs.com/grave-master/p/17763278.html

相关文章

  • 高精度
    用处当我们做一些(SB)题时,会发现答案有可能会爆longlong,那么这时候就要用高精度了实现高精度其实就是用一个数组存数位来表示这个数,然后模拟加,减,乘的过程来算出答案高精度板子(加法)for(inti=10000;i>=1;i--){c[i]+=(a[i]+b[i])%10;c[i+1]+=(a[i]+b......
  • 高精度加法
    一、算法描述高精度问题是指两个数字非常大,超过了int,甚至longlong的范围,数字的位数甚至能达到\(10^5\),那么如果要实现这样两个大数字的运算,需要解决以下两个问题:如何存储?这样的两个数字相加是不可能用普通类型来存储的,所以我们第一个要解决的问题就是如何存储高精度数。首......
  • 工程实践之高精度计算器
    说明本代码使用easyx绘制计算器界面,同时使用高精度算法实现大整数的连续运算前提准备需要安装easyx图形库,具体安装和使用流程请点击链接查看代码怎么用需要新建一个工程,向工程中添加头文件和源代码,或者先把所有头文件都提取出来放到一个新的cpp(虽然是c语言,但是easyx底层实现用......
  • 一个高精度24位ADC芯片ADS1222的使用方法及参考电路程序成都控制器定制
    前一段时间,在做单片机、PLC、电路板、控制器/箱、仪器仪表、机电设备或系统、自动化、工控、传感、数据采集、自控系统、控制系统,物联网,电子产品,软件、APP开发设计定制定做开发项目时,有要求用到24位的高精度ADC,用于对外部信号采集。经查阅,初步获得一款满足要求的芯片:ADS1222,本文......
  • 高精度除法
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;vector<int>div(vector<int>&A,int&b,int&r){vector<int>C;r=0;//r为余数for(inti=A.size()-1;i>=0......
  • 算法基础之高精度总结
    高精度算法分类分类:加、减、乘、除其中加减乘都适用于两个数都是高精度,除法因为除数是高精度的话不好用整除的方法,所以除法时被除数是高精度,除数是整型。高精度加减乘除的异同点加和乘相同点需要从低位到高位处理for(inti=stra.size()-1;i>=0;i--)c.push_back(stra[i......
  • 高精度乘法
    1#include<iostream>2#include<vector>3usingnamespacestd;45vector<int>mul(vector<int>&A,int&b)6{7vector<int>C;8intt=0;9for(inti=0;i<A.size()||t;i++)10......
  • 基础高精度算法:高精度四则运算
    #if1#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;vector<int>add(vector<int>A,vector<int>B){vector<int>C;intt=0;for(inti=0;i<A.size()||i&l......
  • 高精度数各位数之和
    高精度数各位数之和 描述 输入一个高精度数,输出它各个位数数字之和。 输入 输入一行,包含一个正整数,数字的位数不超过1000位。 输出 输出高精度数的各位数之和。 输入样例1 123456789009876543211234567890输出样例1135 #include<io......
  • 高精度数的绝对值
     高精度数的绝对值 描述 输入一个高精度数,输出它的绝对值。 输入 输入一行,包含一个正整数,数字的位数不超过1000位。 输出 高精度数的绝对值。 输入样例1 -12345678900987654输出样例112345678900987654输入样例2 654321123456......