c++习题25-大整数加法

news2024/11/23 1:35:05

目录

一,题目

二,思路

三,代码 


一,题目

描述

求两个不超过200位的非负整数的和。

输入

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样本输入 1
22222222222222222222
33333333333333333333

示例输出 1

55555555555555555555

二,思路

为了考虑到进位,长短不一样的两个字符串及便于发现规律,我将输入改成:

输入样例        

98765432123456
123456789

相应的输出样例如下

98765555580245

根据题目描述,可以先有下面的思路👇

  1. 200位的非负整数很大,推荐使用字符串的方法来解决问题,因此可以先定义字符数组变量int a[201],int b[201],int r[202],并通过键盘输入对字符数组a和b进行初始化,字符数组r用来输出(之所以数组r要比字符数组a和b多一个元素,主要还是考虑到进位问题,例如4×4=16,字符数组r就会有2个元素);

  2. 接着开始处理键盘输入的两个字符串a和b:

    a:98765432123456
    b:123456789      
    字符数组a和b的元素最多有201个,现在a有15个,b有10个(包含结束符'\0'),a和b剩下的部分都未被初始化,没有明确赋值,因此内容不确定,是随机的,可能是任何值。
  3. 在计算加减法,列竖式的时候都是将要计算的数先末尾对齐之后再进行一一计算,因此我脑海中第一个想到的就是将元素较少的字符串移位,让它和元素较多的字符串对齐,对齐之后就可以使得较少元素的字符串中本来不是倒数第一个的元素变成了倒数第一,其它元素也类推:
    98765432123456
             123456789
    之后再将两个字符串的倒数第一位相加,倒数第二位相加......但是移位很麻烦,因为需要先判断哪个是元素个数较少的字符串,之后再对相应的字符串进行操作,这个需要很多的步骤,所以我就将这个想法扼杀到摇篮里。接着我又想着在不移位的前提下,找到元素较少的字符串最后一个元素的下标(下标:元素较多的字符串的元素个数-元素较少的字符串的元素个数-1)再运算,显然这种方法也比较麻烦,因为需要找到元素较少的字符串。有兴趣的可以去尝试。这篇文章主要是用另外一种更加方便的方法。

  4. 考虑可以直接将这两个字符串分别使用reverse函数进行反转,就不需要用到移位:
    65432123456789
    987654321

    反转之后的两个字符串a和b从第一个字符开始遍历:
    ·因为需要将较长字符串中的所有元素遍历到,所以遍历长度为元素最多的字符串的元素个数
    ·在执行for循环之前先定义整型变量la存储字符串a的元素个数,整型变量lb存储字符串b的元素个数,使用max函数就可以得到for循环的循环次数m=max(la,lb);

    在遍历过程中先将对应字符转换成整数之后再相加:
    ·例如数组a的第一个元素是字符'6',如果想要得到整数6,就需要让字符'6'减去字符'0'(因为两个字符相减,是对应的整数ASCII码相减,所以得到的是整数)
    ·得到整数6之后,需要使用变量存储,不然这个值就会消失,因此使用整型d1变量存储字符数组a中每一次转换好的整数,整型d3变量存储字符数组b中每一次转换好的整数,因为d1和d2的值是在遍历字符串的时候需要用到的变量,所以可以直接放到for循环里面。

  5. 在第四步中已经可以得到两个字符串中参与的运算的每一个整数,接下来就需要考虑进位问题,在字符串a,b
    65432123456789
    987654321
    中,a[0]+b[0]=6+9=15,进1位,留下5。由于分别位于两个字符串中的第一个元素6和9(下标为0)前面没有元素,因此,它们前面的进位为0。由于第二个元素(下标为1)的两个元素a[1]+b[1]=5+8=13还得加上前面的进位1,既结果是14。因此需要在for循环外面定义一个整型变量  用来存储进位的数,初始值为0(最左边的两个数相加,进位为0)。
    所以两数运算的结果不仅有d1和d2还需要j,由于每一次的计算结果c不一样,可以将int c=d1+d2+j;放到for循环里面。

    【需要注意两点:】
    1,字符串中有字符的地方是初始化过的,但是没有初始化过的地方,内容随机且未知,需要手动的编写代码,将这部分的每一个字符作为数字0“返回”。
    之前提到strlen可以返回数组的元素个数,就已经告诉了我两个字符数组未初始化的地方:
    ·以字符数组a为例,当索引超过la时,后面的都是为初始化的部分,需要“返回”数字0。如果索引没有超过la,那么d1就是字符串a在遍历长度内的确切元素,可以通过循环变量作为索引找到。因此这里可以使用三元运算符(或称条件运算符)
    ·a?b:c;   →如果a为真,执行b操作,如果a为假,执行c操作。【三元运算符,先真后假】
    既:int d1=i<la?a[i]-'0':0;  // 如果索引没有超过字符数组a的元素个数,那么就返回存在的整数,否则返回整数0,让0参与运算。
    ·字符数组b也需要进行判断:int d2=i<lb?b[i]-'0':0; 

    2,在第四步中提到,要能够遍历完元素较多的字符串,需要遍历次数为m次,循环变量i从0开始,循环条件 i<m;  如果遍历到了字符串的最后一个元素,两个数相加有进位,那么这个进位就会丢失掉,循环条件设成i<=m就可以解决这个进位丢失的问题,但随之而来的就是多了前导0,那么,该如何解决?很简单,既然丢失的是进位,那么肯定是从进位变量 j 入手,当 j=1时,表示有进位,即使i已经大于m,但是仍需要继续循环,将计算的结果放到结果数组r中。所以循环条件需要修改成  i<m || j;
    i < m || j 的意思是:

    如果 i 小于 m,则条件为真。
    如果 j 非零(即 j 为真),则条件也为真。
    这意味着,循环将继续执行,直到 i 不再小于 m 并且 j 为零(假)。

  6. 通过第五步,已经计算出两字符串上指定位置的两数相加的结果,这个时候就可以将结果c存储到字符数组r中(在存结果的时候需要不是直接将c存进去,因为c此时可能是个两位数,需要对10取模,得到个位上的数,之后再将整数加上字符'0'转换成字符就行)

  7. 成功将一个结果存储到字符数组r中之后,存储进位数的变量 j   也需要改变值,如果c是两位数,既c/10>0。否则c/10==0,因此,直接令 j = c / 10; 即可。

  8. 在反转字符数组 r 并且在 字符数组  r 的最后一位加上结束符 之后,直接输出字符数组 r  就是所需要的结果。

三,代码 

#include <bits/stdc++.h>
using namespace std;
int main()
{
	char a[201],b[201],r[202];
	cin >>a>>b;
	reverse(a,a+strlen(a));
	reverse(b,b+strlen(b));
	int la=strlen(a),lb=strlen(b),m=max(la,lb),j=0,s=0;
	for (int i=0; i<m||j; i++)
	{
		int d1=(i<la)?a[i]-'0':0;
		int d2=(i<lb)?b[i]-'0':0;
		int c=d1+d2+j;
		r[s++]=(c%10)+'0';
		j=c/10;
	}
	reverse(r,r+s);
	r[s]='\0';
	cout<<r;
	return 0;
}

 有问题请在评论区留言或者是私信我,回复时间不超过一天。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Physics of Language Models学习小结

1.概述 Physics of Language Models 参考&#xff1a;https://zhuanlan.zhihu.com/p/711391378 这是一系列论文和一个新的LLM研究方向&#xff0c;官网的概述如下。 苹果掉落&#xff0c;盒子移动&#xff0c;但重力和惯性等普遍规律对技术进步至关重要。虽然GPT-5或LLaMA-…

Threejs学习-三维坐标系、相机控件

坐标系&#xff1a; Three.js 使用的是右手坐标系&#xff0c;x 轴朝右&#xff0c;y 轴朝上&#xff0c;z 轴朝向自己。 相机控件轨道控制器 相机控件OrbitControls 通过相机控件OrbitControls实现旋转缩放预览效果。 // 设置相机控件轨道控制器OrbitControls const contr…

fastjson漏洞分析与复现

一、基础知识 Fastjson介绍&#xff1a; fastjson是阿里巴巴开源的JSON解析库&#xff0c;它可以解析JSON格式的字符串&#xff0c;支持将Java Bean序列化为JSON字符串&#xff0c;也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字…

IDEA插件支持API调试、接口用例支持一键同步API变更,MeterSphere开源持续测试工具v3.2.0版本发布

2024年8月26日&#xff0c;MeterSphere开源持续测试工具正式发布v3.2.0版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;MeterSphere API Debugger插件支持API调试&#xff0c;接口用例支持一键同步API变更&#xff1b;测试管理方面&#xff0c;在“测试用例”模块中…

牛客笔试训练

牛客.过桥 在函数 public static int n;public static int[]arrnew int[2001];public static int bfs(){int left1;int right1;int ret0;while(left<right){ret;int rright;for(int ileft;i<right;i){rMath.max(r,arr[i]i);if(r>n){return ret;}}leftright1;rightr;}…

网络原理 TCP与UDP协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1.应用层 之前编写完了基本的 java socket &#xff0c;要知道&#xff0c;我们之前所写的所有代码都在应⽤层&#xff0c;都是为了 完成某项…

关键点检测——HRNet源码解析篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

linux下部署数据库总结

数据库 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。 NoSQ…

JVM理论篇(一)

一、类加载子系统 1.1 类加载子系统作用 类加载子系统负责从文件系统或者网络中加载Class文件&#xff0c;Class文件在文件开头有特定的文件标识。(CAFEBABE)ClassLoader只负责class文件的加载&#xff0c;至于它是否可以运行&#xff0c;则由Execution Engine 执行引擎决定。…

Spire.PDF for .NET【文档操作】演示:创建标记的 PDF 文档

带标签的 PDF&#xff08;也称为 PDF/UA&#xff09;是一种包含底层标签树&#xff08;类似于 HTML&#xff09;的 PDF&#xff0c;用于定义文档的结构。这些标签可以帮助屏幕阅读器浏览整个文档而不会丢失任何信息。本文介绍如何使用Spire.PDF for .NET在 C# 和 VB.NET 中从头…

Python中csv文件的操作3

在《Python中csv文件的操作2》中提到&#xff0c;with as语句可以自动关闭文件&#xff0c;而该语句可以和csv模块中的函数配合使用&#xff0c;达到读取和写入csv文件的目的。 1 csv文件的读取 使用csv模块中的函数读取csv文件的代码如图1所示。 图1 使用csv模块中的函数读取…

AI终于杀死了Leetcode!网友:面试神器已到位

家人们&#xff0c;今早起来 x 上一个帖子引起了奶茶的注意&#xff1a; 什么&#xff1f;奶茶以为自己没睡醒&#xff0c;揉了揉眼睛一看&#xff0c;没看错的话&#xff0c;这不就是AI结束了比赛吗。。。。 原文链接&#xff1a; https://www.reddit.com/r/leetcode/comments…

【ES6新特性】ES6新特性中Promise对象的概念,Async函数的使用以及Module语法

目录 1.Promise 对象 1.1 概念 1.2 使用 2.Async函数 2.1 同步和异步的区别 3.Mdule语法 1.Promise 对象 1.1 概念 Promise 是异步编程的一种解决方案&#xff0c;简单说就是一个容器&#xff0c;里面保存着某个未来才会结束 的事件&#xff08;通常是一个异步操作&#…

初识QT:从创建到认识

QT怎么安装这里就不说了&#xff0c;直接从使用开始 文章目录 1.QT项目的创建及介绍2.Hello QT&#xff01;2.1 图形化形式创建2.2 代码形式创建 3.对象树3.1 内存泄漏与对象树3.2 通过C类理解释放过程 4.乱码问题4.1 如何查看编码方式4.2 如何处理乱码 提示&#xff1a;QT项目…

arm 指令移位操作(11)

逻辑左移&#xff1a; 可以使寄存器也可以是 立即数 LSL &#xff1a; 字母缩写 举例&#xff1a; MOV R0&#xff0c;R1 &#xff0c;LSL #2 向左移位后&#xff0c;右面填0补充 逻辑右移&#xff1a; 可以使寄存器也可以是 立即数 LSR &#xff1a; 字母缩写 举例&…

10天速通Tkinter库——Day7:主菜单及图鉴

本篇博客我将介绍Tkinter实践项目《植物杂交实验室》中的杂交实验室主菜单、基础植物图鉴、杂交植物图鉴、杂交植物更多信息四个页面的制作。 它们作为主窗口的子页面实例&#xff0c;除了继承主窗口的基础设置&#xff08;如图标、标题、尺寸等等&#xff09;、还可以使用主窗…

《黑神话:悟空》游戏中的福建元素

《黑神话&#xff1a;悟空》作为一款深受玩家喜爱的动作角色扮演游戏&#xff0c;不仅在游戏剧情和角色设计上独具匠心&#xff0c;还巧妙地融入了丰富的中国传统文化元素&#xff0c;其中福建元素尤为突出。以下是对游戏中福建元素的详细解析&#xff1a; 一、地域文化与背景…

《机器学习》—— 支持向量机(SVM)实现二分类问题

文章目录 一、什么是支持向量机&#xff08;SVM&#xff09;1、SVM两个基本概念2、SVM的原理 二、示例&#xff1a;支持向量机&#xff08;SVM&#xff09;实现二分类问题1、先选取两个特征&#xff0c;并进行可视化2、选取所有的特征传入模型&#xff0c;并对模型进行评估 一、…

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出 文章目录 一、基本原理1. 基本原理核极限学习机&#xff08;KELM&#xff09; 2. NGO-KELM回归预测流程1. 数据预处理2. 核极限学习机&#xff08;KELM&#xff09;模型构建3. 北方苍鹰优…

【Tomcat+MySQL+Redis源码安装三件套】

TomcatMySQLRedis源码安装三件套 Tomcat部分概念Tomcat的作用Tomcat的原理Linux运维中的应用场景具体操作示例 基本使用流程实验Tomcat安装tomcat的反向代理及负载均衡源地址hash(不能负载)tomcat负载均衡实现&#xff08;使用cookie&#xff09; memcached 操作命令 理论补充结…