两个大数相加的三种实现方法
方法 实现 两个 三种 相加 大数
2023-09-27 14:28:50 时间
方法一:
import java.math.BigDecimal;
/**
* 两个大数相加
*
* @author
* @version $Id: BigNumberAdd.java, v 0.1 2014年8月18日 下午2:13:20
*/
public class BigNumberAdd1 {
public static void main(String[] args) {
String num1 = "34646313135453431";
String num2 = "999999999121111";
int len1 = num1.length();
int len2 = num2.length();
if(len1 > len2){
for(int i=0; i<len1 - len2; i++){
num2 = "0" + num2;
}
} else if (len1 < len2){
for(int i=0; i<len2-len1; i++){
num1 = "0" + num1;
}
}
int[] arr1 = str2intArr(num1);
int[] arr2 = str2intArr(num2);
arr1 = reverse(arr1);
arr2 = reverse(arr2);
int[] result = add(arr1, arr2);
for(int i=result.length-1; i>=0; i--){
if(i == result.length-1 && result[i] == 0) continue;
System.out.print(result[i]);
}
System.out.println();
System.out.println("****************以下为对照结果******************");
BigDecimal b1 = new BigDecimal(num1);
BigDecimal b2 = new BigDecimal(num2);
BigDecimal b3 = b1.add(b2);
System.out.println(b3);
}
/**
* 核心方法 两个整型数组相加
*
* @param a
* @param b
* @return
*/
public static int[] add(int[] a,int[] b){
int maxlen = a.length;
int[] sum = new int[maxlen + 1];
for(int i=0; i<maxlen; i++){
int tempSum = a[i] + b[i];
sum[i] += tempSum % 10;
int d = tempSum / 10; // 进位
sum[i+1] += d;
}
return sum;
}
/**
* 将字符串转换成整型数组
*
* @param str
* @return
*/
public static int[] str2intArr(String str){
int len = str.length();
int[] arr = new int[len];
for(int i=0; i<len; i++){
arr[i] = str.charAt(i) - '0';
}
return arr;
}
/**
* 倒置数组元素
*
* @param arr
* @return
*/
public static int[] reverse(int[] arr){
for(int i=0,j=arr.length-1;i<j; i++,j--){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
public static void print(int[] arr){
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]);
}
System.out.println();
}
}
方法二:
public class BigNumberAdd2 {
public static void main(String[] args) {
String str1 = "34646313135453431";
String str2 = "999999999121111";
int len1 = str1.length();
int len2 = str2.length();
if(len1 > len2){
for(int i=0; i<len1-len2; i++){
str2 = "0" + str2;
}
} else if(len1 < len2){
for(int i=0; i<len2-len1; i++){
str1 = "0" + str1;
}
}
System.out.println(add(str1, str2));
}
public static String add(String str1, String str2){
boolean flag = false;
String result = "";
for(int i=str1.length()-1; i>=0; i--){
int a = str1.charAt(i) - '0';
int b = str2.charAt(i) - '0';
int sum = 0;
if(flag){
sum = 1;
}
sum += (a + b);
if(sum / 10 > 0){
flag = true;
} else {
flag = false;
}
result = sum % 10 + result;
}
return result;
}
}
方法三:
public class BigNumberAdd3 {
public static void main(String[] args) {
String num1 = "34646313135453431";
String num2 = "999999999121111";
int len1 = num1.length();
int len2 = num2.length();
if(len1 > len2){
for(int i=0; i<len1 - len2; i++){
num2 = "0" + num2;
}
} else if (len1 < len2){
for(int i=0; i<len2-len1; i++){
num1 = "0" + num1;
}
}
int[] arr = new int[len1 + 1];
for(int i=len1-1; i>=0; i--){
int a = num1.charAt(i) - '0';
int b = num2.charAt(i) - '0';
arr[i+1] = a + b;
}
for(int i=len1; i>0; i--){
int temp = arr[i];
arr[i] = temp % 10;
arr[i-1] = arr[i-1] + temp / 10;
}
String result = toString(arr);
if(result.charAt(0) == '0') {
result = result.substring(1);
}
System.out.println(result);
}
public static String toString(int[] arr){
StringBuilder sb = new StringBuilder();
for(int i=0; i<arr.length; i++){
sb.append(arr[i]);
}
return sb.toString();
}
}
相关文章
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- php 中实现页面跳转的方法
- Java Float Double浮点保留两位小数的三种实现方法
- 运维前线:一线运维专家的运维方法、技巧与实践1.6 运维自动化系统的实现
- springboot常用方法手记
- 总结以下三种方法,实现c#每隔一段时间执行代码:
- Java 方法超详细整理,适合新手入门
- 原生JS取代一些JQuery方法的简单实现
- 基于C++实现的记分板调度方法仿真【100010674】
- iOS开发基础:OC数组对象NSArray的常用方法
- Android自定义属性时TypedArray的使用方法
- 兼顾pc和移动端的textarea字数监控的实现方法
- java 泛型接口和方法
- flink 两个datastream实现left_join的两种方法
- RabbitMQ镜像+脑裂配置方法windows版,亲测后编写的公司文档
- java使用jsp servlet来防止csrf 攻击的实现方法
- 【Java数据结构与算法】LeetCode 0206. 反转链表的三种Java实现方法
- Javascript 实现复制(Copy)动作方法总结
- SIMetrix导入MOS管SPICE参数进行仿真的快速方法
- CSS实现9宫格布局的4种方法:flex、float、grid、table布局
- golang 实现程序运行时函数动态替换,举例说明动态注入和替换本地方法、系统库方法、第三方库方法,附完整源码实现
- C/C++ 计算时间差的五种方法 / Qt 计算时间差的两种方法