[Java]大数运算之加法
一 题目
- Input:
- String a = "15324564...1455445"; //数字过长,不能转换为int/long型运算
- String b = "45645612...145"; //数字过长,不能转换为int/long型运算
- Output:
- x = a + b
- 基本思路:
- 当字符串a、b的长度不等时:将二字符串的长度调整到相同
- 即 短的字符串 高位补0 → 以此避免后续 对高位的判断、繁琐处理
- 分别转换为字符数组
- 从后向前(右对齐),逐位运算
- 当字符串a、b的长度不等时:将二字符串的长度调整到相同
二 源码实现
import java.util.Scanner;
public class BigDecimalAdd {
public static String convertIntArrayToString(int[] intArray) {
StringBuffer stringBuffer = new StringBuffer();
boolean isNotStart = true; //从左至右, 只要一直遇到的是0,则为true
for (int i = 0; i < intArray.length; i++) {
if (isNotStart) {
if (intArray[i] != 0) {
isNotStart = false;
stringBuffer.append(intArray[i]);
}
} else {
stringBuffer.append(intArray[i]);
}
}
return stringBuffer.toString();
}
public static String plus(String a, String b) { //大数相加
int maxLength = a.length() > b.length() ? a.length() : b.length();
int minLength = a.length() < b.length() ? a.length() : b.length();
//1将二字符串调整到相同长度 and 2转换为字符串数组
if(maxLength!=minLength){ //长度不相同时 才需要对 短字符串的高位补0
StringBuffer sb = new StringBuffer();
for(int i=0,dif=maxLength-minLength;i<dif;i++){
sb.append("0");
}
if(a.length()!=maxLength){//a是需要补0的字符串 即 左边(高位)补0 (以此避免后续 对高位的判断、繁琐处理)
a = sb.toString() + a;
} else {//b是需要补0的字符串
b = sb.toString() + b;
}
}
char[] numbersA = a.toCharArray();
char[] numbersB = b.toCharArray();
int[] result = new int[maxLength + 1];//默认 各位初始化值为0
int bitOperateResult; //临时保存位运算的结果
//3开始运算: 两数对比各位进行运算
for (int i = 1; i <= maxLength; i++) {
bitOperateResult = result[result.length - i] + Character.getNumericValue(numbersA[numbersA.length - i]) + Character.getNumericValue(numbersB[numbersB.length - i]);
result[result.length - i] = bitOperateResult % 10; //低位留余
result[result.length - i - 1] = result[result.length - i - 1] + bitOperateResult / 10; //高位进
}
return convertIntArrayToString(result);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
String b = scanner.next();
System.out.println("a + b = " + plus(a, b));
}
}
12345
100
a + b = 12445
三 延伸问题
1 多个大数相加呢?
2 2个大数的加、减、乘、除、模?
3 除了上述【整数】的运算,那【浮点数】的运算呢?
4 JDK实现: Java的大数运算类 java.math.BigInteger 与 java.math.BigDecimal

[Java]大数运算之加法的更多相关文章
- 收藏的一段关于java大数运算的代码
收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...
- java 大数运算[转]
用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...
- JAVA大数运算
java大数是个好东西,用起来方便,代码短. 代码如下: import java.util.*; import java.math.*; public class Main { public stat ...
- java大数运算(讲解)
在算法竞赛或者面试中我们经常遇到大数问题,例如求一个很大的阶层,大数加法等等. 住在这种情况下我们用常规解法(使用long long或long long int)肯定是不行的, 而我们自己用c/c++ ...
- Java 大数运算
import java.util.*; import java.math.*; public class Main{ public static void main(String args[]){ S ...
- java 大数运算,高精度模板
转自:https://blog.csdn.net/stffer/article/details/46382949 有修改 关于BigInteger类更详细的用法请移步官方文档 package prac ...
- 大数运算之 Java BigInteger 的基本用法
大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInt ...
- js,java,浮点数运算错误及应对方法
js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...
- java 大数计算
这几天做了几道用大数的题,发现java来做大数运算十分方便.对acmer来说是十分实用的 1.valueOf(parament); 将参数转换为制定的类型 比如 int a=3; BigInteger ...
- 大数运算Swift
前几天开始,打算用Swift写大数的运算,加法跟乘法都已经写好了,写减法发现,真是难,感觉有可能是我的想法不对?不不不我相信我的逻辑. 首先把数字分成小数部分跟整数部分,再遍历一下,识别当前的结果,是 ...
随机推荐
- 网页元素间距测量(better rule插件的使用)
我们在测试UI界面的时候,需要测量各元素大小及元素之间的距离.元素大小,使用F12可以简易的得到数据,但是元素的间距相对来说会比较复杂.这里推荐一款chrome插件better rule,帮助大家测量 ...
- C代码调用C++动态库
最近在工作中遇到了修改C++代码嵌入到C代码中去,C肯定不能直接用C++代码,就需要自己去修改成C代码,所以我就决定在C中调用C++动态库(谁让我懒呢),话不多说,直接上步骤 第一步:编写C++代码 ...
- Dependencies 和 Libraries 的区别
Dependencies 和 Libraries 的区别 - 如何导入 jar 包 虽然现在的项目大多数人更愿意使用 Maven 等工具构建,但是在学习 Project Structure 这块的时候 ...
- Day1.无敌难受且成功
Markdown学习 标题 字体 ctrl+b.l.u.k加粗.斜体.下划线.超链接 引用 大于号+空格 分割线 三个*** ###都 图片 !+[]+() 英文输入法的符号 输入的图片路径可本地也要 ...
- C#-读取写入Excel
/// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名 ...
- 2003031118—李伟—Python数据分析五一假期作业—MySQL的安装以及使用
项目 期中试卷 课程班级博客链接 20级数据班(本) 这个作业要求链接 作业要求 博客名称 2003031118-李伟-Python数据分析五一假期作业-MySQL的安装以及使用 要 ...
- 解决SpringBoot前后端集成项目导出jar包运行访问页面资源报错“Whitelabel Error Page”问题
一.SpringBoot前后端集成项目导出jar包后运行访问页面资源报错"Whitelabel Error Page"问题 二.解决方案 1.将Controller层移入com.x ...
- 使用navicat连接本地数据库时,出现错误1251错误
在安装完MySQL的时候,我们现在一般都使用Navicat来连接数据库,可惜出现下面的错误:1251-Client does not support authentication protocol r ...
- Resnet网络--BasicBlock与BottleNeck
ResNetV2的网络深度有18,34,50,101,152.50层以下的网络基础块是BasicBlock,50层及以上的网络基础块是BottleNeck. BasicBlock 图示如下 代码实现 ...
- Vue学习day1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...