首页 > 编程语言 >数据结构算法系列----高精度加法(大数相加)、处理前导零

数据结构算法系列----高精度加法(大数相加)、处理前导零

时间:2024-03-14 13:03:04浏览次数:26  
标签:pre 大数 int res ---- carry 前导 数据结构 data

目录

一、为什么要使用高精度加法

二、处理前导零

1、为什么要处理前导零

2、处理前导零的代码

三、处理大数相加

四、完整代码即例题


一、为什么要使用高精度加法

   当处理远大于long long数据范围的数时,通常会将这些大数表示为字符串,然后通过字符串的方式进行加减乘除运算。在处理大数运算时,我们可以通过模拟手工计算的方式来实现加减乘除运算,例如加法:从个位开始逐位相加。


二、处理前导零

1、为什么要处理前导零

   提到高精度算法就不得不提到前导零,由于题目给我们的数据经常是:a=00112,b=00223 这样类型的因此在进行基本运算时我们要先获得去除前导零的串

2、处理前导零的代码

  把需要处理的字符串传到这个data_pre函数中即可

string data_pre(string num){
    int i=0;  
    while(i<num.size()&&num[i]=='0'){
        i++;
    }
    if(i==num.size()){return "0";} //如果i会等于num的长度就说明num全是0
    else return num.substr(i);   //substr(i)的意思是截取i之后到末尾的数
}

三、处理大数相加

  具体步骤写在代码注释

int main(){
    string a,b;
    string res;
    int carry=0;
    cin>>a>>b;
    a=data_pre(a);
    b=data_pre(b);
    int i=a.size()-1,j=b.size()-1;  // 让i,和j分别指向a和b的最后一位
    while(i>=0||j>=0||carry>0){ 
        int data1,data2;//     每一轮循环定义两个数,分别代表a[i]和b[i]在这一位的数
        if(i>=0){    
            data1=a[i]-'0';
            i--;    
        } else{
            data1=0;
        }
        if(j>=0){
            data2=b[j]-'0';
            j--;
        } else{
            data2=0;
        }
        int sum=data1+data2+carry;
        carry=sum/10; //carry就是进位 
        res+=sum%10+'0'; 
    }
    reverse(res.begin(),res.end());

四、完整代码即例题

例题链接:https://ac.nowcoder.com/acm/problem/226350

#include<bits/stdc++.h>
using namespace std;

// 函数用于去除字符串前面的零
string data_pre(string num){
    int i=0;
    while(i<num.size() && num[i]=='0'){
        i++;
    }
    if(i==num.size()){
        return "0";
    } else{
        return num.substr(i);
    }
}

int main(){
    string a, b;
    string res;
    cin >> a >> b;
    a = data_pre(a);
    b = data_pre(b);
    int m = a.size()-1, n = b.size()-1;
    int carry = 0;
    while(m>=0 || n>=0 || carry>0){
        int digit1, digit2;
        if(m>=0){
            digit1 = a[m] - '0'; // 获取当前位数字
            m--;
        } else{
            digit1 = 0; // 若已遍历完a,设当前位为0
        }
        if(n>=0){
            digit2 = b[n] - '0'; // 获取当前位数字
            n--;
        } else{
            digit2 = 0; // 若已遍历完b,设当前位为0
        }
        int sum = digit1 + digit2 + carry; // 计算当前位相加之和
        res += sum % 10 + '0'; // 将当前位的结果加入到res中
        carry = sum / 10; // 更新进位
    }
    reverse(res.begin(), res.end()); // 反转结果字符串
    cout << res << endl; // 输出计算结果
}

标签:pre,大数,int,res,----,carry,前导,数据结构,data
From: https://blog.csdn.net/2301_77961281/article/details/136692596

相关文章

  • VMwear虚拟机的安装与使用(Win11)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、前言什么是VMware?VMware与Linux二、VWmear下载与安装(1)安装VMware虚拟机软件。(2)按照指引安装完成后,单击“许可证”按钮输入密钥(3)创建RHEL8.3虚拟机。(4)对虚拟机的RHEL8.3系统做快照和恢......
  • 循环双向链表,精简代码秒懂!(C语言)
    #include<stdio.h>#include<stdlib.h>typedefintE;/***循环双链表*初始化*插入元素*删除元素*求链表总长*@return*/structArrayNode{Ee;structArrayNode*prev;structArrayNode*next;};typedefstructArrayNode*......
  • 通过构造函数实现属性赋值(含有具体例子)
    一、什么是构造函数?new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)调用构造器的时候,如果你的类中没有写构造器,那么系统会默认给你分配一个构造器,只是我们看不到罢了。可以自己显式的将构造器编写出来:构造器的格式:[修饰符]构造器的名字(){}构造器和方法的......
  • 2024HVV行动-进军蓝中研判(log4j2、fastjson、Struts2、Shiro)
    1、log4j2特征:恶意请求中包含JNDI协议地址,如"ldap://"、"rmi://"等,被log4j2解析为JNDI查找。原理:在日志输出中,未对字符进行严格的过滤,执行了JNDI协议加载的远程恶意脚本,从而造成远程代码执行。影响:严重的RCE,2.0≤ApacheLog4j2<2.15.0-rc2攻击字段:${jndi......
  • Python 向函数传递参数(小结)
    目录1、位置实参2、关键字实参3、形参默认值4、将队列的副本传入函数5、传递任意数量的实参6、传递任意数量的关键字实参1、位置实参调用函数时,传递参数的顺序与函数定义中的参数顺序一致。defperson(name,age):passperson('Marry',34)2、关键字实参调用......
  • Python 文件操作(小结)
    目录1打开文件1.1文件路径1.2打开‘中文’文件1.3 with打开1.3打开模式1.4打开异常2读取文件2.1一次性读取全部,read()2.2遍历文件,每次读取一行2.3with外使用文件内容3写文件1打开文件1.1文件路径程序文件所在路径为“当前路径”。(1)如果文件位于“......
  • FaceShift人脸表情识别原理分析
    之前负责了一个数字人应用平台的建设,其中一个核心功能是用摄像头实时捕捉用户的脸部图像,然后通过表情识别算法分析出用户的表情信息,驱动数字人做出同样的表情。这个功能已经在动画电影制作和游戏动画人物制作中频繁使用,目前更多的是穿戴专业的动捕服在专业的动捕篷中完成,制作成......
  • python教程(中更新中)
    递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。举个例子,我们来计算阶乘n!=1x2x3x...xn,用函数fact(n)表示,可以看出:����(�)=�!=1×2×3×⋅⋅⋅×(�−1)×�=(�−1)!×�=����(�−1)×�fact(n)=n!=1×2×3×⋅⋅⋅×(n−1)×n=(n−1)!×n......
  • 数字排列 - 华为OD统一考试(C卷)
    OD统一考试(C卷)分值:200分题解:Java/Python/C++题目描述小明负责公司年会,想出一个趣味游戏:屏幕给出1−9中任意4个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第n位置的数字,其中n为给出数字中最大的(如果不到这么多数字则......
  • 微信小程序第三章总结
    3.1、盒子模型盒子模型就是我们在页面设计中经常用到的一种思维模型。在CSS中,一个独立的盒子模型由内容(content)、内边距(padding)、边框(border)、和外边距(margin)4个部分组成,如图:此外,对padding、border、和margin可以进一步细化为上、下、左、右4个部分,在CSS中可以分别进行设置......