当前位置: 首页 > 编程日记 > 正文

数据结构(十)栈的作用--大数的加法运算

一、大数加法的定义

在Java中,整数类型有四种,byte(8位)、short(16位)、int(32位)、long(64位)。

其中,int类型为32为,也就是说最大的整数为2^31,如果超过了这个数,那么就不能再用整型变量来保存,更不用说保存两个这么大的数的和了。

大数就是值超过整数最大上限的数,为了解决两个大数的求和问题,可以把两个加数看成是数字字符串,将这些数的相应数字存储在两个栈中,并从两个栈中弹出对应位的数字一次执行加法即可得到结果。

二、大数加法的实现

1.代码实现

    public String addOfLargeNum(String a, String b) throws Exception {LinkStack sum = new LinkStack();              // 大数的和LinkStack sA = numSplit(a);                    // 加数字符串以单个字符的形式放入栈中
        sA.stackTraverse();LinkStack sB = numSplit(b);                    // 被加数字符串以单个字符的形式放入栈中
        sB.stackTraverse();int partialSum;                                // 对应位置的两个数相加boolean isCarry = false;                    // 是否仅为标识while (!sA.isEmpty() && !sB.isEmpty()) {    // 两个栈都不为空partialSum = (Integer) sA.Pop() + (Integer)sB.Pop();    // 将两个栈的栈顶元素即大数的个位相加if (isCarry) {                // 判断低位是否有进位partialSum++;            // 如果有进位就加1isCarry = false;        // 重置进位标识
            }if (partialSum >= 10) {        // 如果超过了10就需要进位partialSum -= 10;        // 取个位数字sum.Push(partialSum);    // 将得到的加和入大数的和栈isCarry = true;            // 将进位标志位置为true} else {sum.Push(partialSum);    // 不需要进位时直接放入栈中
            }}LinkStack temp = !sA.isEmpty()? sA : sB;    // 如果有一个加数比另一个加数短,则取长的那个加数加完剩下的栈while (!temp.isEmpty()) {                    if (isCarry) {                            // 最后一次执行加法运算中需要进位int t = (Integer)temp.Pop();        // 取出没有参加加法的位t++;                                // 加上进位位1if (t >= 10) {                        // 如果超过10,就需要进位t -= 10;sum.Push(t);                    // 这里没有改变进位标识isCarry,下一次还是true} else {sum.Push(t);                    // 不需要进位时直接入和栈isCarry = false;                }} else {sum.Push(temp.Pop());}}if (isCarry) {        // 最高一位入栈后仍然需要进位的情况sum.Push(1);    // 再最高位的前一位入栈
        }String str = new String();while (!sum.isEmpty()) {    // 将栈中的数按正常顺序转化为字符串输出str = str.concat(sum.Pop().toString());}return str;}// 将字符串以单个字符的形式放入栈中,并去除字符串中的空格,返回以单个字符为元素的栈private LinkStack numSplit(String str) throws Exception {LinkStack s = new LinkStack();for (int i = 0; i < str.length(); i++) {        char c = str.charAt(i);                        if (c == ' ') {                                        // 去除空格continue;    } else if ('0' <= c && c <= '9') {                    // 判断是不是0到9之间的数s.Push(Integer.valueOf(String.valueOf(c)));        // 如果是,就将数字入栈} else {throw new Exception("输入了非法数字型字符");}}return s;}

2.测试和输出

    public static void main(String[] args) throws Exception {AdditionOfLargeNumbers add = new AdditionOfLargeNumbers();String largeNum1 = "18 452 453 389 943 209 752 345 473";String largeNum2 = "8 123 542 678 432 986 899 334";System.out.println("两个大数相加得到的和为: " + add.addOfLargeNum(largeNum1, largeNum2));System.out.print("\n");System.out.println("两个大数相加得到的和为: " + add.addOfLargeNum("784", "8 465"));}输出:
此时,链栈中的元素为: 37454325790234998335425481
此时,链栈中的元素为: 4339986892348762453218
两个大数相加得到的和为: 18460576932621642739244807此时,链栈中的元素为: 487
此时,链栈中的元素为: 5648
两个大数相加得到的和为: 9249

3.分析代码执行过程

大数加法算法中主要是isCarry标志位的切换:以“784” + “8 465”为例:
首先,将两个字符取出空格并压入两个栈中,即sA=(栈顶)487, sB=(栈顶)5648
然后4出栈,5出栈,4+5=9,isCarry为false,9入栈sum,
然后8出栈,6出栈,8+6=14,isCarry为true,14-10=4入栈sum,
然后7出栈,4出栈,7+4+1=12,isCarry为true,12-10=2入栈sum,
此时sA为空,temp=sB=8,8出栈,8+1=9,isCarry为false,9入栈sum,
最后将栈sum按顺序输出为:924

转载于:https://www.cnblogs.com/BigJunOba/p/9187814.html

相关文章:

分布式技术一周技术动态 2016-11-27

分布式系统实践 1. 大数据时代快速SQL引擎-Impala http://dwz.cn/4G9mvt 摘要: 在Dremel论文发表之后&#xff0c;开源社区涌现出了一批基于MPP架构的SQL-on-Hadoop(HDFS)查询引擎&#xff0c;典型代表有Apache Impala、Presto、Apache Drill、Apache HAWQ等&#xff0c;看上去…

vuerouter3种模式_Vue-router的三种传参方式

第一种传递参数&#xff1a;name传参两步完成name传参并显示在模板中&#xff1b;第一在router/index.js中配置name属性&#xff0c;routes: [{path: /,name: HelloWorld,component: HelloWorld},]第二步在src/App.vue接收{{ $route.name }}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

以太坊的数据结构

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊被描述为为一个交易驱动的状态机&#xff0c;它在某个状态下接受一些输入后&#xff0c;会确定的转移到一个新的状态。具体来说&#xff0c;…

(转载)虚幻引擎3--9掌握虚幻技术UnrealScript 预处理器

第九章 – UNREALSCRIPT预处理器9.1概述9.2 MACRO(宏)的基础知识指南 9.1 –您的第一个宏9.3具有参数的宏指南 9.2 – MACRO参数9.4内置宏DEFINE IF/ELSE/ENDIF 实例: IF/ELSE/ENDIF的应用 INCLUDE ISDEFINED/NOTDEFINED 示例: 结合使用 …

springboot添加多数据源连接池并配置Mybatis

springboot添加多数据源连接池并配置Mybatis 转载请注明出处&#xff1a;https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018 星期六&#xff0c;那是个晴天&#xff0c;天湛蓝湛蓝的非常干净&#xff0c;仿佛飘过一粒尘埃也能看得清清楚楚&#xff0c;然后就发生…

lua菜鸟教程_Lua 环境安装

Lua 环境安装Linux 系统上安装Linux & Mac上安装 Lua 安装非常简单&#xff0c;只需要下载源码包并在终端解压编译即可&#xff0c;本文使用了5.3.0版本进行安装&#xff1a;curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gztar zxf lua-5.3.0.tar.gzcd lua-5.3.0make …

以太坊智能合约Demo

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 智能合约开发用solidity编程语言部署在以太坊这个区块链平台&#xff0c;本文提供一个官方实战demo示例快速入门&#xff0c;用demo例子深入浅出智…

Java学习笔记七——数组工具类Arrays

数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组。若将里面的方法用熟的话&#xff0c;那开发效率会大大提高。下面介绍其中的方法。 List<T> asList(T... a) 作用&#xff1a;将指定数组或数组元素&#xff0c;转换成固定大小的List。…

c++窗口管理系统是什么_优秀的食堂管理系统让你对校园生活更充满希望

面对今年疫情环境下的种种困难&#xff0c;各大高校纷纷根据情况采取不同的措施&#xff0c;应对开学的各种难题。解决返校学生就餐就是一大难点。学校后勤工作人员少之又少&#xff0c;开设的食堂窗口也供不应求。这也直接导致了后勤人员懒散&#xff0c;食堂阿姨给菜“手抖”…

ACM训练小结-2018年6月16日

今天题目情况如下&#xff1a;A题&#xff1a;线段树XOR性质。情况&#xff1a;由于写法问题&#xff0c;调试困难&#xff0c;浪费大量时间。B题&#xff1a;&#xff08;对所有满足i mod pq&#xff0c;求a[i]之和&#xff09;&#xff0c;无修改&#xff0c;直接上n*sqrt(n)…

加密货币的本质

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 去年&#xff0c;比特币暴涨&#xff0c;其他币也像雨后春笋一样冒出来&#xff0c;已经有1000多种了。 很多人都在问&#xff0c;加密货币&#…

「2018山东一轮集训」 Tree

为什么出题人这么毒瘤啊&#xff1f;&#xff1f;&#xff01;&#xff01;一个分块还要带log的题非要出成n<2*1e5。。。。。。。 为了卡过最后两个点我做了无数常数优化&#xff0c;包括但不限于&#xff1a;把所有线段树改成 存差分的树状数组&#xff1b;把树剖求LCA的极…

mysql 表空间收缩_mysql表碎片清理和表空间收缩

mysql表碎片清理和表空间收缩(即清理碎片后report_site_day.ibd文件磁盘空间减小,该方案基于独立表空间存储方式)OPTIMIZETABLE [tablename],当然这种方式只适用于独立表空间清除碎片的优点:降低访问表时的IO,提高mysql性能,释放表空间降低磁盘空间使用率OPTIMIZE TABLE ipvacl…

spring security remember me实现自动登录

1 默认策略 在我们自定义的login中增加一个选择框 <input type"submit" value"Login" /> <br/> <br/> <input type"checkbox" valuetrue name"_spring_security_remember_me" />记住密码 <!-- 记住…

野指针与内存泄漏那些事

野指针&#xff1a;不是NULL指针&#xff0c;是指向垃圾内存的指针 野指针成因&#xff1a; 1.指针变量没有被初始化&#xff1a;指针变量在创建时同时应当被初始化&#xff0c;要么将指针设置为NULL&#xff0c;要么让它指向合法的内存。 2.指针p被free或者delete,没有被设置为…

参数等效模型可以用于_等效媒质理论(介电参数反演)

听说过超材料的读者大概率会了解一个知识点&#xff0c;复杂的媒质块可以等效为一块平板&#xff0c;当然这是有条件的。比如模型小于十分之一波长之类的&#xff0c;尤其对模型厚度要求严格些。大家在查找等效媒质理论文献的时候&#xff0c;可能会被繁杂的理论解释弄得爆炸&a…

js日期格式化Date

使用Date类进行日期格式化。 1 输入“yyyy-MM-dd hh:mm:ss”格式的String字符串&#xff0c;返回字符串 做一个简单判定&#xff0c;在当日显示为几点几分&#xff0c;同年为月日&#xff0c;不同年显示年月 1 function dateFormat(str){2 //str格式为yyyy-mm-dd h…

(十九)异常处理

什么是异常处理 异常就是程序运行时发生错误的信号&#xff08;在程序出现错误时&#xff0c;则会产生一个异常&#xff0c;若程序没有处理它&#xff0c;则会抛出该异常&#xff0c;程序的运行也随之终止&#xff09;&#xff0c;在python中,错误触发的异常如下 语法错误&…

jquery 获取一组元素的选中项 - 函数、jquery获取复选框值、jquery获取单选按钮值...

做表单提交时&#xff0c;如果现在还在用form提交&#xff0c;用户体验很差&#xff0c;所以一般使用ajax提交。 其中需要获取每个表单输入元素的值&#xff0c;获取的时候像文本框这些还好说&#xff0c;Jquery提供了 .val() 方法&#xff0c;获取很方便&#xff0c;但是获取复…

geany怎么创建文件夹_教程详情|Geany怎么使用,Geany安装使用教程_234游戏网

Geany是利用GTK 2工具包开发的一个快速、轻巧的集成开发环境&#xff0c;具有良好的可移植性和通用性、安全性&#xff0c;广泛应用于各个行业。Geany具有语法高亮、代码折叠、代码自动完成等功能&#xff0c;非常适合开发人员使用。下面是关于Geany安装使用教程&#xff0c;希…

Django模板系统和admin模块

只需要记两种特殊符号&#xff1a;{{ }}和 {% %}变量相关的用 {{}}&#xff0c; 逻辑相关的用 {%%}。 Filters 语法&#xff1a; {{ value|filter_name:参数 }}default{{ value|default: "nothing"}} 如果value值没传的话就显示nothinglength{{ value|length }}|左右…

finalshell文件列表不显示_Jira面板配置_待办事项不显示问题列表

最近&#xff0c;使用jira进行项目管理&#xff0c;出现一些问题&#xff0c;对于其中一些配置&#xff0c;做下记录&#xff0c;后续方便查看&#xff0c;也给需要的人一个参考&#xff0c;传送门&#xff1a;jira使用文档_Java_pang787559613的博客-CSDN博客​blog.csdn.netj…

背单词:3年,34150分钟!

转载于:https://www.cnblogs.com/sx00xs/p/6128618.html

如何学习区块链技术

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 有效地学习区块链技术&#xff0c;您需要深入了解区块链协议和一些编程语言。记住区块链是一种可以用各种编程语言实现的协议。看下面的例子&#…

.net里鼠标选中的text数据怎么获取_Python数据科学实践 | 爬虫1

点击上方蓝色字体&#xff0c;关注我们大家好&#xff0c;基于Python的数据科学实践课程又到来了&#xff0c;大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。前面几章大家学习了如何利用Python处理与清洗数据&#xff0c;如何探索性数据分析&#xff0c;以及如何利用…

redis实现对账(集合比较)功能

现状&#xff1a;每日在进行系统之间的订单对账时&#xff0c;往往是这样的操作流程&#xff1b; 1.从外部系统拉取数据存入本地数据库&#xff1b; 2.查询本地订单数据集合localSet&#xff1b; 3.查询外部系统订单数据集合outerSet; 4.以本地localSet为基准&#xff0c;对照o…

Javascript刷题 》 查找数组元素位置

找出元素 item 在给定数组 arr 中的位置 输出描述: function indexOf(arr, item) {..... } 如果数组中存在 item&#xff0c;则返回元素在数组中的位置&#xff0c;否则返回 -1 输入例子: indexOf([ 1, 2, 3, 4 ], 3) 输出例子: 2 实现方法 1、先将arr转换成字符串&#xff0c;…

Go 语言函数

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 函数是基本的代码块&#xff0c;用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执…

终端主题_再见 XShell 和 ITerm 2,是时候拥抱全平台高颜值终端工具 Hyper 了!

点击上方“涛哥聊Python”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达转自&#xff1a;运维之美不论是 macOS 还是 Windows 下&#xff0c;我们都不推荐使用系统自带终端。无论是可拓展性还是可编程性都被「系统自带」这样的特点限制。特别是 Windows 下的…

每天一个linux命令(8):cp 命令

cp命令用来复制文件或者目录&#xff0c;是Linux系统中最常用的命令之一。一般情况下&#xff0c;shell会设置一个别名&#xff0c;在命令行下复制文件时&#xff0c;如果目标文件已经存在&#xff0c;就会询问是否覆盖&#xff0c;不管你是否使用-i参数。但是如果是在shell脚本…