K:大数加法
相关介绍:
在java中,整数是有最大上限的。所谓大数是指超过整数最大上限的数,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 432 123 212 443就是两个大数,在java中这是无法用整型int变量或长整型long变量来进行保存的,更不用说保存他们之间相加的和了。为解决该问题,可以把两个相加数看成是字符串,将这些数的相应数字存储在两个堆栈中,并从两个栈中弹出对应位的数字依次执行加法可得到结果,以784和8465为例进行加法的计算过程。

对于两个大数的加法,其操作步骤归纳如下:
- 将两个加数的相应位从高位到低位依次压入栈sA和sB中。
- 若两个加数栈都非空,则依次从栈中弹出栈顶数字相加,和存入变量partialSum中,若和有进位,则将和的个位数压入结果栈sum中,并将进位数加到下一位数字相加的和中,若和没有进位,则直接将和压入结果栈sum中
- 若某个加数堆栈为空,则将非空加数栈中的栈顶数字依次弹出与进位相加,和的个位数压入结果栈sum中,直到此该栈为空为止,若最高位有进位,则最后将1压入栈sum中
- 若两个加数栈都为空,则栈sum中保存的就是计算结果。注意栈顶是所得计算结果的最高位
其代码如下:
package queueandstack;
import java.util.Stack;
/**
* 该类用于演示大数加法的相关代码
* @author 学徒
*
*/
public class BigNumberAdd
{
/**
* 求两个大数的和,加数与被加数以字符串的形式输入(允许大数中出现空格),计算的结果也以字符串的形式返回
*/
public String add(String number1,String number2)throws Exception
{
Stack result=new Stack();//大数的和
Stack number1Stack=numberSplit(number1);//加数字符串以单个字符的形式放入栈中
Stack number2Stack=numberSplit(number2);//被加数字符串以单个字符的形式放入栈中
int partialSum;//对于两个位的求和
boolean isCarry=false;//进位标志
while(!number1Stack.isEmpty()&&!number2Stack.isEmpty())//加数和被加数栈同时非空
{
partialSum=(Integer)number1Stack.pop()+(Integer)number2Stack.pop();//对于两个位进行求和,并在栈中去除掉加数和被加数中的该位
//当有低位的进位时
if(isCarry)
{
partialSum++;
isCarry=false;
}
//需要进行进位
if(partialSum>=10)
{
partialSum-=10;
isCarry=true;
}
//将本位的结果放入结果栈中
result.push(partialSum);
}
Stack temp=!number1Stack.isEmpty()?number1Stack:number2Stack;//将temp引用指向加数和被加数中非空栈
while(!temp.isEmpty())
{
//当最后一次加法运算中存在进位的时候
if(isCarry)
{
int t=(Integer)temp.pop();//取出其中的加数或者被加数中没有参加的位
++t;//进位加到此位上
if(t>=10)//当其需要进行进位的时候
{
t-=10;
}
else//重置其进位标志
{
isCarry=false;
}
result.push(t);
}
else//最后一次执行加法运算中不需要进位
{
result.push(temp.pop());//把加数或者被加数中非空的值放入和中
}
}
if(isCarry)//将最高位加入到结果中
{
result.push(1);
}
String resultstr=new String();
while(!result.isEmpty())
{
//把栈中的元素转化为字符串
resultstr=resultstr.concat(result.pop().toString());
}
return resultstr;
}
/**
* 该方法用于将输入的大数拆分成单个的字符,并去掉字符串中的空格,返回以单个字符为元素的栈
*
*/
public Stack numberSplit(String str)throws Exception
{
Stack result=new Stack();
for(int i=0;i<str.length();i++)
{
char c=str.charAt(i);//指定索引处的char值
if(' '==c)//去除掉空格
continue;
else if('0'<=c&&'9'>=c)//将数字放入栈中
result.push(Integer.valueOf(String.valueOf(c)));
else
throw new Exception("错误:输入了非数字型的字符!");
}
return result;
}
/**
* 用于测试程序
*/
public static void main(String[] args)throws Exception
{
BigNumberAdd a=new BigNumberAdd();
System.out.println("两个大数为:");
System.out.println("1. 18 452 543 389 943 209 752 345 473");
System.out.println("2. 8 123 542 678 432 986 899 334");
System.out.println("其和为:");
System.out.println(a.add("18 452 543 389 943 209 752 345 473", "8 123 542 678 432 986 899 334"));
}
}
运行结果:
两个大数为:
1. 18 452 543 389 943 209 752 345 473
2. 8 123 542 678 432 986 899 334
其和为:
18460666932621642739244807
K:大数加法的更多相关文章
- 51nod 1005 大数加法
#include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...
- vector、string实现大数加法乘法
理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...
- hdu_1041(Computer Transformation) 大数加法模板+找规律
Computer Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- Hat's Fibonacci(大数加法+直接暴力)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1250 hdu1250: Hat's Fibonacci Time Limit: 2000/1000 M ...
- A + B Problem II(大数加法)
http://acm.hdu.edu.cn/showproblem.php?pid=1002 A + B Problem II Time Limit: 2000/1000 MS (Java/Other ...
- 【BZOJ3110】K大数查询(整体二分)
[BZOJ3110]K大数查询(整体二分) 题面 BZOJ 题解 看了很久整体二分 一直不知道哪里写错了 ... 又把树状数组当成线段树区间加法来用了.. 整体二分还是要想清楚在干什么: 我们考虑第\ ...
- 大数加法~HDU 1002 A + B Problem II
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1002 题意: 数学题,A+B; 思路,这个数非常大,普通加法一定会超时,所以用大数加法.大数加法的基 ...
- ZZNU 2125:A + B 普拉斯(傻逼题+大数加法)
2125: A + B 普拉斯 时间限制: 1 Sec 内存限制: 128 MB 提交: 94 解决: 28 [提交] [状态] [讨论版] [命题人:admin] 题目描述 "别人总说 ...
- poj3535 A+B (大数加法)
A+B Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 811 Accepted: 371 Description The ...
- HDU——1715大菲波数(大数加法)
大菲波数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
随机推荐
- Java 设计模式——单例模式
Java有很多的设计模式,但是让我们一个个分析出来,可能就一脸蒙逼了,今天就和大家一块来分析一下Java中的一些常用的设计模式.今天先分析单例模式 单例模式的好处 举个例子:有一个类,里面有若干个公共 ...
- jmeter - jp@gc - Active Threads Over Time(多台负载用户)
问题: 线程数设置:30,远程启动2台机子 查看 jp@gc - Active Threads Over Time图,发现只统计了1台机子的线程数,线程数并不是60: 解决办法: 官方文档中提到: 1 ...
- 8102 年的现代 Web 开发最佳实践(笑)
简评:8102 年了,现在 web 开发的最佳实践是什么,让本文来告诉你.原文只提到一部分,可以查看 reddit 上对此文的评论查看补充的最佳实践 https://old.reddit.com/r/ ...
- Java_日志接口实现
日志的接口实现:改用slf4j实现日志功能 为什么要使用slf4j,而不是用log4j或者其他日志框架? 因为slf4j只是规定了一堆实现了日志的接口,并不关心日志怎么实现,这样就可以让项目脱离对日志 ...
- Xcode升级到9.3之后pod问题
最近新建了一个项目,然后在终端pod init的时候出现了问题,复制粘贴部分错误信息 MacBook-Pro:testDemo xywy$ pod init [in /Users/xywy/Deskt ...
- 44.oracle表空间的使用
要给下属充分的发挥空间,要允许下属犯错,下属犯错自己能顶下来就顶着,不要盯得让下属觉得“这不是我的事,我只是个小打工的”,团建要放在首位.不可在下属面前“装B”,别人也不傻. Oracle数据库开创性 ...
- 4、TensorFlow基础(二)常用API与变量作用域
1.图.操作和张量 TensorFlow 的计算表现为数据流图,所以 tf.Graph 类中包含一系列表示计算的操作对象(tf.Operation),以及在操作之间流动的数据 — 张量对象(tf.Te ...
- springboot(十三)-分库分表-手动配置
sharding-jdbc简介 Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零: 可适用于任何基于java的ORM框架,如:JPA, Hib ...
- RocketMQ学习笔记(一)eclipse版的quickstart
学而时习之,不亦说乎! 自己搭建个学习用的RocketMQ总是很麻烦,需要虚拟机环境,网络,需要安装rocketmq,启动.时间久了再去看,又不知道这个虚拟机是干嘛的了. 直接在eclipse中启动, ...
- java 并发编程——Thread 源码重新学习
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...