首页 > 编程语言 >C++实现高精度减法

C++实现高精度减法

时间:2023-08-07 10:33:56浏览次数:39  
标签:return 数字 高精度 int C++ 减法 我们 size

一、问题描述:

       高精度算法是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。

二、解决思路:

       其实按照上面的描述,我们也知道了我们需要将数中的每一个位进行相减。然后我们想到了我们使用字符串的话,可以很方便的取出每一个字符。然后我们就将数字按照字符串的形式输入进去。然后我们每取出来一个值,就将它转换为整数型,然后这个时候,我们就可以接着进行计算了。

       我们这里需要实现的是减法运算,这也就意味着,我们可能存在被减数小于减数的情况,这个时候,我们有一个办法,就是先进行判断,如果被减数<减数,那么我们需要将他们颠倒计算,再添上一个‘-’号。至于如何判断,这个分为两种情况,一种情况是说A的位数和B的位数不相等(如A是三位数,B是六位数),还有一种情况是说A和B的位数相等,但是其中一位的数字不相等(如123和153这两个数字)

       然后我们就可以进行计算了,计算的时候,我们还需要考虑一个问题,就是123-153只中,2<5这种情况,这意味着我们需要对更高位进行借位的情况,这个时候我们需要将借位情况计入一个变量t中,t的值只能是1或者0.然后如果借了位,那么被减数这一位的数字+10,更高位的数字-1.

三、代码实现:

#include<iostream>
#include<vector>

using namespace std;

bool cmp(vector<int>A,vector<int>B){
    if(A.size()!=B.size()) return A.size()>B.size();//获得判定条件,为了方便后面的判断
    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;
    for(int i=0,t=0;i<A.size();i++){
        t=A[i]-t;//如果借位了,就需要借位的那个1减掉去
        if(i<B.size()) t-=B[i];//如果B的位数小于A的位数,那么就不用计算了,直接把值传下去
        C.push_back((t+10)%10);//这个分为两种情况,一种是A-B的值够用,一种是A-B的值不够用(这个时候我们就向A的上一位借1进行计算)
        if(t<0) t=1;//借了位进行标记,上一位需要剪掉1
        else t=0;
    }

    while(C.size()>1&&C.back()==0) C.pop_back();//将类似于3000这样值的末尾0减掉去,但是会保留单独的0这样的值
    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');//注意,这里我们使用的是i=a.size()-1,这是因为我们需要从个位开始计算

    vector<int> C;
    if(cmp(A,B)){
        C=sub(A,B);
    }else{
        C=sub(B,A);
        cout<<'-';
    }

    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    cout<<endl;

    return 0;
}

 

标签:return,数字,高精度,int,C++,减法,我们,size
From: https://www.cnblogs.com/TomHard/p/17610781.html

相关文章

  • 配置 Sublime Text4为 C++ 编辑器的方法
    概述涉及以下插件的安装和配置PackageControl Terminus LSP LSP-clangd clang-format LSP-pyright LSP-json配置sublime安装PackageControl以进行包管理。Terminus安装Terminus以实现sublimetext4内的terminal。绑定快捷键:[ { "keys":[ "ctrl+shift+t" ], "com......
  • msvc++工程之vs版本升级及工程目录规范
    为什么要升级msvc++工程版本对msvc++工程进行vs版本升级,一方面是可以使用较新的C++标准及对64位更好的支持。首先你需要对msvc++project文件有一定的了解,主要是vcxproj和vcxproj.filter这两个文件,升级的时候需要手动修改sln和vcxproj文件。vs(visualstuiod)中vc++工程的Filte......
  • C++核心编程——引用
    引用1引用的基本使用作用:给变量起别名语法:数据类型&别名=原名示例:intmain(){ inta=10; int&b=a; cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; b=100; cout<<"a="&......
  • C与C++之间的相互调用及函数区别
    最近项目需要使用googletest(以下简称为gtest)作为单元测试框架,但是项目本身过于庞大,main函数无从找起,需要将gtest框架编译成静态库使用。因为项目本身是通过纯c语言编写,而gtest则是一个c++编写的测试框架,其中必然涉及c与c++之间的相互调用。注意,本文的前提是,c代码采用gcc等c语言编......
  • C/C++经典书籍
    记录四本C/C++的经典书籍。最经典的莫过于1988年出版的《TheCProgrammingLanguage》第二版1.C1.1零基础:CPrimerPlus,SixthEdition,作者:StephenPrata,2013年出版,涵盖C11标准1.2C语言作者巨著(适合有C基础的阅读):TheCProgrammingLanguage,SecondEdition,作者:Denni......
  • C++入门到放弃(09)——友元:friend
    ​1.基本用法友元的概念还是比较简单的,主要作用是,让声明的友元函数或者友元类,可以直接访问当前类的私有成员。可以这样理解,友元声明代表了,向大家说明这个函数或类是我的朋友(friend),因此它可以随意使用我内部的私有成员。基本形式:friend+函数声明friend+class+类名classPoin......
  • 1.创建一个类,类A中定义了一个方法,该方法能接受3个参数根据参数判断是做加法还是减法并
    classA:defcal(self,x,y,z):ifz=='+':returnx+yifz=='-':returnx-yelse:print('error')a=A()b=a.cal(3,4,'+')print(b)运行结果: 2.延伸:创建一个类,类B......
  • 【VSCode】mac系统利用VSCode配置C++环境
    https://blog.csdn.net/bsy1111/article/details/131056647在官网上看到VSformac不能建C++项目,找到一个教程用VSCode配置一下C++环境可以跑点简单的代码应付一下日常使用,要是有大佬知道怎么在mac上用VisualStudio写C++的话还麻烦不吝赐教......
  • C++动态规划经典试题解析之打家劫舍系列
    1.前言力扣上有几道与打家劫舍相关的题目,算是学习动态规划时常被提及的经典试题,很有代表性,常在因内大大小小的社区内看到众人对此类问题的讨论。学习最好的方式便是归纳总结、借鉴消化,基于这个目的,本文对此类问题也做了讲解,在一些优秀思想的基础上添加了个人观点。闲话少说,进入......
  • 最低通行费C++
    题目描述】一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。这个商人期望在规定时间内用最少......