百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

C++信奥之径,锻炼思维,扎实算法——模拟与高精度算法(4)

liuian 2025-01-14 15:21 72 浏览

【模版题】高精度减法

题目描述

算法解析

1、与上期的高精度加法类似,本题的数字由于最多到达10086位,C++中能存储数据位数最多的_int128类型(在后续的编程技巧中会介绍这一个特殊的大存储类型)也存储不下这个数字,所以需要使用高精度减法来计算结果。

2、同样需要先解决存储两个减数的问题,用字符串string或字符数组char[]来存储。

3、高精度减法的算法原理也是小学数学的减法竖式计算,过程为:(1)数位对齐;(2)从个位开始减,不够就借位;(3)存储结果,计算最终答案的位数,以便去掉前导0。

接下来用程序设计语言描述整个过程。

01

数位对齐

这部分代码与高精度加法一致,可以参考前一篇文章(点击跳转查看)。

同时,在初始化的时候,需要判断a和b的大小,我们只做a>b的减法。如果a-b<0,那么根据减法的规则,a-b = -(b-a),需要交换a和b,并输出负号。

02

从个位开始减,不够就借位

每一位a[i]-b[i]后,需要判断减下来的结果,如果>=0就正常相减,如果<0,说明a[i]需要向高位借1才能与b[i]相减,此时需要c[i+1]--来实现向高位借一,同时要注意高位的减法答案因为借位要-1,而-1也会反馈在高位的减法中。

因此,可以每次将借位的情况传递到c[i+1]上去,如果c[i+1]==0,就表示没有借位,如果c[i+1]==-1,表明前一位减法有借位。因此当前位的减法应该要类似于下面的代码:

c[i] = a[i] - b[i] + c[i]; //+c[i]的目的是加上之前是否有的借位
if(c[i] < 0){
  c[i+1]--; //先借位
  c[i]+=10; //再算出真正结果
}

03

存储结果,计算最终答案的位数,以便去掉前导0

在初始化数据时,我们会大致判断答案数组c的大小肯定不大于max(lena,lenb),即a和b字符串中较大的那个。

但是,如果a和b的长度一致,那么相减得到的结果c可能会位数很少,例如10001-10000=1,但是c数组中储存的答案为00001,这时候就需要去掉前导0来保证答案为数学数字。

使用while循环,当c数组的首位是0时,lenc--,从而获取到正确的答案数组c的长度。具体代码为:

while(c[lenc-1]==0 && lenc>0) //lenc>0是以防最终答案是0的情况
    lenc--;

【参考代码】

#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001],c[10002],lena,lenb,lenc;
int main(){
  string l1,l2;
  cin>>l1>>l2;
  lena=l1.length();lenb=l2.length();
  //判断a和b的大小 
  if(lena<lenb || (lena==lenb && l1<l2)){
    swap(l1,l2);
    cout<<"-";
  }
  //处理数字
  lena=l1.length();
  lenb=l2.length();
  for(int i=0;i<lena;i++)
    a[lena-i]=l1[i]-'0';
  for(int i=0;i<lenb;i++)
    b[lenb-i]=l2[i]-'0';
  lenc=max(lena,lenb);
  //模拟竖式相减
  for(int i=1;i<=lenc;i++){
    c[i]=a[i]+c[i]-b[i];
    if(c[i]<0){
      c[i+1]--;
      c[i]+=10;
    }
  }
  //处理答案的前导0 
  while(c[lenc-1]==0 && lenc>0)
    lenc--;
  //如果0都被处理掉了,那么答案就是0
  if(lenc==0){
    cout<<0;
  }
  else{
    for(int i=lenc;i>0;i--)
      cout<<c[i];
  }
  return 0; 
}

代码中的C++知识解读

swap()函数

在C++的std标准库中,我们常用swap()函数来进行两个变量或元素的交换,其中函数模版为:

swap()函数

在C++的std标准库中,我们常用swap()函数来进行两个变量或元素的交换,其中函数模版为:

void swap(T &a,T &b){
  T c(a);
  a = b;
  b = c;
}

代码中的T为类型,根据实际需要可以使用相应的类型。swap()函数支持相同数据类型的变量值相互交换,例如:

int a,b;
float x,y;
string s1,s2;
//赋值后
swap(a,b);
swap(x,y);
swap(s1,s2);


特别地,在string字符串和vector可变数组的函数中,也有自带成员函数swap():

string s1,s2;
s1.swap(s2);
vector<int> a1,a2;
a1.swap(a2);

从而实现两个字符串、两个数组内容的交换,并且vector数组在经过容器交换后,还能实现内存空间的收缩,从而节约内存。

运行结果

相关推荐

win11怎么激活(win11怎么激活office)

目前,Windows11的永久激活方法还没有被公开或者确认。不过,你可以尝试以下几种方法来激活Windows11:使用数字许可证:如果你的电脑已经安装了Windows10并且已经激活,那么你可以...

笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
  • 笔记本电脑快捷键大全(笔记本电脑快捷键大全常用)
苹果恢复出厂设置(苹果恢复出厂设置还能恢复数据吗)

首先打开手机上面的“设置”功能,进入手机的系统设置。进入手机的设置后,选择“通用"。进入通用之后,往下滑动页面,在页面的最下方可以看到“还原”的选项,点击进入。进入还原之后,有多个还原选项,我...

路由器的配置步骤(路由器配置教学)

打开浏览器-输入192.168.1.1(一般路由器地址是这个或者查看路由器背面的登录信息)进路由-输入用户名,密码,(默认一般是admin)。2、在【设置向导】里,选择【PPOE拨号】(有些是ADS...

psp模拟器ios(psp模拟器ios推荐)

psp手机模拟器推荐PPSSPP,作为最流行的开源PSP模拟器,因为其强大的功能和兼容性广受玩家们喜爱。虽然提供了PC和安卓双平台的支持,但是有碍于安卓设备的硬件,移动端PPSSPP的功能并不完整。不...

台式机重装系统按f几(重装电脑系统按f几)

F8、F9、F10、F11、F12、F2、del。一般用到这几个。下面以联想电脑装WIN10系统为例:1、将制作好的U盘插入要重装系统的电脑,开机画面出现电脑品牌logo时,不停地按“f2键”进入“B...

win10激活错误代码0x8007007b

Win10激活出现0x8007007b解决方法如下1、找到计算机,右键点击属性,确认你的电脑系统是否是windows10。2、鼠标右击桌面,依次点击个性化-主题-桌面图标设置,勾选计算机后依次点击应用...

4000台式电脑最好的组装配置
4000台式电脑最好的组装配置

四千元价格组装电脑主机与五千元组装电脑主机的价格类似,因为电脑主机就几个大部件,电脑主机主板是多少代的产品?主板内存的插槽数?电脑处理器等如果是自己组装,都可以配置到十二代产品,电脑硬盘可以分为256G固态硬盘做系统盘,1T机械硬盘作为工作...

2025-11-06 20:05 liuian

linux是一种什么系统(linux属于什么系统)

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。其内核由林纳斯·本纳第克特·托瓦兹于1991年1...

手机管理大师免费版(手机管理大师极速版)

使用手机“文件管理”打开文件夹时提示访问受限,需要前往“文件”应用查看1.进入手机设置——安全——应用权限——权限/应用2.在手机桌面找到手机管家——权限隐私——应用权限——权限/应用?当然,相对于被...

电脑能开机但是进不去桌面怎么办

打开任务管理器按Ctrl+Shift+Esc打开任务管理器。文件中运行新任务点击文件,运行新任务。输入指令重启桌面输入explorer.exe,点击确定,等待桌面重启完成就可以了。电脑已经是我们生活中...

怎样解除自动关机模式(怎样解除自动开关机)

1、打开手机主界面,找到系统自带的“时钟”应用,点击打开它。2、点击进入时钟后,点击右下角的“计时器”。3、进入到计时器后,点击“在计时结束启用雷达”这个选项。4、然后在这里,下拉到最下面,勾选“停...

电脑最高配置是什么配置2025

一,2023最新主流电脑装机配置如下。二,处理器可以使用十二代的i512400或者i512490f,内存16gb双通道,显卡rtx3060,主板可以使用b660m或者h610m。三,如果十三代酷睿...

MySQL慢查询优化:从explain到索引,DBA手把手教你提升10倍性能

数据库性能是应用系统的生命线,而慢查询就像隐藏在系统中的定时炸弹。某电商平台曾因一条未优化的SQL导致订单系统响应时间从200ms飙升至8秒,最终引发用户投诉和订单流失。今天我们就来系统学习MySQL...

一文读懂SQL五大操作类别(DDL/DML/DQL/DCL/TCL)的基础语法

在SQL中,DDL、DML、DQL、DCL、TCL是按操作类型划分的五大核心语言类别,缩写及简介如下:DDL(DataDefinitionLanguage,数据定义语言):用于定义和管理数据库结构...