Java 大数相乘、大数相加、大数相减
思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329
/**
* @date 2018/6/22
* @description
*/
public class BigNumUtil { /**
* 大数相乘
* @param a
* @param b
* @return
*/
public static String multi(String a,String b){ //1.判断相乘之后的符号
char signA = a.charAt(0);
char signB = b.charAt(0);
boolean isPositive = true;
if(signA == '+' || signA == '-'){
if(signA == '+'){
isPositive = true;
}else{
isPositive = false;
}
a = a.substring(1);
} if(signB == '+' || signB == '-'){
if(signB == '+' && isPositive){
isPositive = true;
}else if(signB == '-' && !isPositive){
isPositive = true;
}else{
isPositive = false;
}
b = b.substring(1);
} //2.反转数字,使用倒序
StringBuilder sb = new StringBuilder(a);
char[] numA = sb.reverse().toString().toCharArray();
sb = new StringBuilder(b);
char[] numB = sb.reverse().toString().toCharArray(); //3.乘法规律:
// 对 a * b 而言,a 的第 i 位和 b 的第 j 位相乘的结果会放在 result[i+j]中
// 两个数(a,b)相乘最后的结果位数一定小于或等于 a.len + b.len ;
int[] result = new int[numA.length + numB.length];
for(int i = 0 ; i < numA.length ; i++){
for(int j = 0 ; j < numB.length ; j++){
result[i+j] += (numA[i] - '0') * (numB[j] - '0');
}
} //4.实现进位运算
for(int i = 0 ; i < result.length ; i++){
if(result[i] > 10){
result[i+1] += result[i] / 10;
result[i] = result[i] % 10 ;
}
} //5.输出结果
StringBuilder re = isPositive ? new StringBuilder() : new StringBuilder("-");
boolean bool = true;
for(int i = result.length-1 ; i >=0 ; i--){
if(result[i] == 0 && bool){
continue;
}else{
bool = false;
}
re.append(result[i]);
} return re.toString();
} /**
* 大数相减
*/
public static String sub(String a ,String b){ char[] numA = new StringBuilder(a).reverse().toString().toCharArray();
char[] numB = new StringBuilder(b).reverse().toString().toCharArray(); //2.判断符号位
boolean isPositive = true;
if(numA.length < numB.length){
isPositive = false;
}else if(numA.length == numB.length){
int i = numA.length - 1 ;
while (i > 0 && numA[i] == numB[i]){
i--;
}
if(numA[i] < numB[i]){
isPositive = false;
}
} //3.开始计算
int maxLen = numA.length > numB.length ? numA.length : numB.length;
int result[] = new int[maxLen];
for(int i = 0 ; i < maxLen ; i++){
int intA = i < numA.length ?(numA[i] - '0') : 0;
int intB = i < numB.length ?(numB[i] - '0') : 0;
if(isPositive){
result[i] = intA - intB;
}else{
result[i] = intB - intA;
}
} //4.进位装换
for(int i = 0 ; i < result.length ; i++){
if(result[i] < 0){
result[i+1] -=1;
result[i] += 10;
}
} //5.输出结果
StringBuilder re = isPositive ? new StringBuilder() : new StringBuilder("-");
boolean bool = true;
for(int i = result.length - 1 ; i >= 0 ; i--){
if(result[i] == 0 && bool){
continue;
}else{
bool = false;
}
re.append(result[i]);
} return re.toString();
} /**
* 大数相加
* @param a
* @param b
* @return
*/
public static String add(String a,String b){ //1.判断相加之后的符号
char signA = a.charAt(0);
char signB = b.charAt(0); if(signA == '-' && signB == '-'){//A B 都是负的
return "-" + add(a.substring(1),b.substring(1));
}else if((signA == '-' && signB != '-')){//A 是负的 B是正的
return sub(b.substring(1),a.substring(1));
}else if(signA != '-' && signB == '-'){//A是正的 B是负的
return sub(a.substring(1),b.substring(1));
} if(signA == '-' || signA == '+'){
a = a.substring(1);
}
if(signB == '-' || signB == '+'){
b = b.substring(1);
} char[] numA = new StringBuilder(a).reverse().toString().toCharArray();
char[] numB = new StringBuilder(b).reverse().toString().toCharArray(); //2.开始计算
int[] result = new int[numA.length + 1];
for(int i = 0 ; i < result.length;i++){
int intA = i < numA.length ? numA[i] - '0' : 0;
int intB = i < numB.length ? numB[i] - '0' : 0;
result[i] = intA + intB;
}
//3.进位转换
for(int i = 0 ; i < result.length ; i++){
if(result[i] > 10){
result[i+1] += result[i] /10;
result[i] = result[i] % 10 ;
}
}
//4.输出结果
StringBuilder re = new StringBuilder();
boolean bool = true;
for(int i = result.length -1 ; i >=0 ; i--){
if(result[i] == 0 && bool){
continue;
}else{
bool = false;
}
re.append(result[i]);
}
return re.toString();
} }
Java 大数相乘、大数相加、大数相减的更多相关文章
- python 变量 不断 相加 or 相减的简便写法 a +=1
相加: 相减:
- suseoj 1207: 大整数的乘法(java, 大数相乘, C/C++, 大数相乘)
1207: 大整数的乘法 时间限制: 1 Sec 内存限制: 128 MB提交: 7 解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 求两个不超过200位的非负整数 ...
- 计算时间 相加,相减 的方法,TimeSpan 数据转换
#region Time calculation method public static string DelayTypeTime_1(DateTime ArrivalTime_1, DateTim ...
- python类中两个列表实例如何相加或相减
如下 import numpy a = [1, 2, 3, 4] b = [5, 6, 7, 8] a_array = numpy.array(a) b_array = numpy.array(b) ...
- Linux C/C++ 编程练手 --- 大数相加和大数相乘
最近写了一个大数相乘和相加的程序,结果看起来是对的.不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的. 可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操 ...
- mysql时间日期相加相减实现
分享篇mysql中日期的一些操作,就是我们常常会用到的mysql时间日期的相加或者相减的了,这个mysql也自己带了函数,有需要的朋友可以参考一下. 最简单的方法 select TO_DAYS(str ...
- 求解Catalan数,(大数相乘,大数相除,大数相加)
Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜 ...
- POJ 2389 Bull Math(水~Java -大数相乘)
题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...
- java版大数相乘
在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用j ...
随机推荐
- Unreal Engine 4 Radiant UI 入门教程(一)制作Radiant HUD
请注意:本篇教程的编号是从零开始的,如果没有看第零篇教程,请前往学习. 本教程介绍如何制作Radiant HUD,这是指将网页元素直接加入到HUD中,效果为: 对应的网页元素为: 第一步: 将之前下载 ...
- 第十七章 Velocity优化实践(待续)
现实存在的问题 优化的理论基础 一个高效的模版引擎实现思路 优化成果 其他优化手段
- dubbo错误排查之No provider available for the service
今天搞的一个dubbo服务,暴漏出来了,但是consumer端启动就报这个错,排查过程记录一下 一.启动zkCli 利用命令查看 ls / ls /dubbo 继续查看 ls /dubbo/com.w ...
- 使用spring-loaded实现应用热部署
作为一名Java开发者您是否会遇到这种情况:新增一个方法或字段必须重启tomcat才能对其进行调试? 有没有办法使得不重启tomcat就能调试呢.spring-loaded就可以. spring-lo ...
- 全局事务/分布式事务 (Global Transaction/ A distributed transaction)之我见
这里参考的是Oracle对于XA的支持,其他的应该雷同吧... 1个分布式事务由多个行为在不同的数据库上执行,1个分布式事务的执行成功意味着相关数据库上的行为执行均成功.“XA协定”(http://w ...
- JAVA中的垃圾回收机制以及其在android开发中的作用
http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...
- 关于c#数据类型,类型转换,变量,常量,转义符。。。
先说一下数据类型...数据类型可以分为两大类:基本数据类型和引用类型. 基本数据类型按功能又分为“值类型”,“布尔型”,“字符型”. 引用类型分为“字符串”,“时间日期”. 没图没真相↓面放图. 橙 ...
- php学习笔记-continue和break
这两个关键字经常被用在循环中,但作用是完全不同的. 在循环中遇到continue这个单词的时候一定要理解为skip,跳过或者略过,啥意思?就是跳过本次循环,后面的循环继续走起来,老铁. break是说 ...
- 10、R常用命令
转载:http://www.bio-info-trainee.com/579.html 关于R语言包的一些操作,挺重要的!!! R的包(package)通常有两种:1 binary package:这 ...
- scala中的self type
scala目前的书籍有两<快学scala>和<scala编程>.资料确实不多,对这个语法使用只能结合使用进行理解. 先看源码: private[spark] trait Act ...