Java实现大数相加、相乘(不使用BigInteger)
大数相加:
package algorithm; //使用BigInteger类验证
import java.math.BigInteger; public class BigAdd {
public static String bigNumberAdd(String f, String s) {
// 翻转两个字符串,并转换成数组
char[] a = new StringBuffer(f).reverse().toString().toCharArray();
char[] b = new StringBuffer(s).reverse().toString().toCharArray();
int lenA = a.length;
int lenB = b.length;
// 计算两个长字符串中的较长字符串的长度
int len = lenA > lenB ? lenA : lenB;
int[] result = new int[len + 1];
for (int i = 0; i < len + 1; i++) {
// 如果当前的i超过了其中的一个,就用0代替,和另一个字符数组中的数字相加
int aint = i < lenA ? (a[i] - '0') : 0;
int bint = i < lenB ? (b[i] - '0') : 0;
result[i] = aint + bint;
}
// 处理结果集合,如果大于10的就向前一位进位,本身进行除10取余
for (int i = 0; i < result.length; i++) {
if (result[i] > 10) {
result[i + 1] += 1;
result[i] %= 10;
}
}
StringBuffer sb = new StringBuffer();
// 该字段用于标识是否有前置0,如果有就不要存储
boolean flag = true;
for (int i = len; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
} else {
flag = false;
}
sb.append(result[i]);
}
return sb.toString();
} // 测试
public static void main(String[] args) {
String n1 = "469552298526666";
String n2 = "97666223339696969";
String n = bigNumberAdd(n1, n2);
System.out.println(n); // 用BigInteger类验证
BigInteger b1 = new BigInteger(n1);
BigInteger b2 = new BigInteger(n2);
System.out.println(b1.add(b2));
}
}
大数相乘:
package algorithm;
import java.math.BigInteger;
public class BigMulti {
public static String bigNumberSimpleMulti(String f, String s) {
// 获取首字符,判断是否是符号位
char signA = f.charAt(0);
char signB = s.charAt(0);
char sign = '+';
if (signA == '+' || signA == '-') {
sign = signA;
f = f.substring(1);
}
if (signB == '+' || signB == '-') {
if (sign == signB) {
sign = '+';
} else {
sign = '-';
}
s = s.substring(1);
}
// 将大数翻转并转换成字符数组
char[] a = new StringBuffer(f).reverse().toString().toCharArray();
char[] b = new StringBuffer(s).reverse().toString().toCharArray();
int lenA = a.length;
int lenB = b.length;
// 计算最终的最大长度
int len = lenA + lenB;
int[] result = new int[len];
// 计算结果集合
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
result[i + j] += (int) (a[i] - '0') * (int) (b[j] - '0');
}
}
// 处理结果集合,如果是大于10的就向前一位进位,本身进行除10取余
for (int i = 0; i < result.length; i++) {
if (result[i] > 10) {
result[i + 1] += result[i] / 10;
result[i] %= 10;
}
}
StringBuffer sb = new StringBuffer();
// 该字段用于标识是否有前置0,如果是0就不需要打印或者存储下来
boolean flag = true;
for (int i = len - 1; i >= 0; i--) {
if (result[i] == 0 && flag) {
continue;
} else {
flag = false;
}
sb.append(result[i]);
}
if (!sb.toString().equals("")) {
if (sign == '-') {
sb.insert(0, sign);
}
} else {
sb.append(0);
}
// 返回最终结果
return sb.toString();
}
// 测试
public static void main(String[] args) {
String n1 = "469552298526666";
String n2 = "97666223339696969";
String n = bigNumberSimpleMulti(n1, n2);
System.out.println(n);
// 用BigInteger类验证
BigInteger b1 = new BigInteger(n1);
BigInteger b2 = new BigInteger(n2);
System.out.println(b1.multiply(b2));
}
}
Java实现大数相加、相乘(不使用BigInteger)的更多相关文章
- A+B and A*B problem 大数相加 相乘 模拟
A+B and A*B problem 大数相加 相乘 模拟 题意 给你两个数a和b,这两个数很大,然后输出这两个数相加的和,相乘的积. 解题思路 模拟,但是还是搜了搜代码实现,发现这个大佬写的是真的 ...
- Java之大数相加
之前参加某公司笔试,机试题目是大数相加,两大数是字符串形式,求和. 当时讨巧用的是BigDecimal类,但是发迷糊了,以为b1.add(b2)后,和就加到b1上了,结果一直输出不对. 其实应该是这样 ...
- java实现大数相加问题
闲来没事.写了个acm中常常遇到的大数加减问题的java 解决代码,我想说.用java的BigInteger 非常easy. 大爱java!! 比如: 实现多组输入的大数加减问题: import ja ...
- hdu1250(Java)大数相加的问题
Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- hdu1002大数相加
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Java 大数相乘、大数相加、大数相减
思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329 /** * @date 2018/6/22 * @description ...
- POJ 1503 Integer Inquiry(大数相加,java)
题目 我要开始练习一些java的简单编程了^v^ import java.io.*; import java.util.*; import java.math.*; public class Main ...
- java大数相加
import java.math.BigInteger; import java.util.Scanner; public class Bignum{ public static void ma ...
- Java大数相加-hdu1047
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1047 题目描述: 题意有点绕,但是仔细的读了后就发现是处理大数相加的问题.注意:输入数据有多组,每组输 ...
随机推荐
- js方法用来获取路径传参上所带的参数
//js方法用来获取路径传参上所带的参数 function GetQueryString(param) { var reg = new RegExp("(^|&)" + p ...
- node起一个简单服务,打开本地项目或文件浏览
1.安装nodejs 2.在项目文件夹目录下创建一个js文件,命名server.js(自定义名称),内容如下 var http = require('http'); var fs = require( ...
- R语言-散点图阵
1.pairs()函数 > pairs(iris[,1:4]) #取iris数据集的第一列到第四列两两作图 2.plot()函数 > plot(iris[,1:4], + main=&qu ...
- JS游戏控制时间代码
var canvas = new HGAME.canvas();var testBox=document.getElementById('boxRender');testBox.appendChild ...
- linux之重定向命令
1.shell重定向概念:shell重定向包含输出重定向和输入重定向 何为输入输出方向?何为标准输入输出方向? 标准输入方向:从键盘读取用户输入的数据,然后再把数据拿到程序(C语言程序.Shell 脚 ...
- C#,如何程序使用正则表达式如何使用匹配的位置的结果修改匹配到的值
程序代码使用正则表达式如何修改匹配到的值: 代码一: using System; using System.Text.RegularExpressions; public class Example ...
- SPS Programming Abrites AVDI or GM MDI
Just information for you to make a wise purchase of GM scan tools for SPS programming: (here, I focu ...
- linux就该这么学,第十天了
今天老师主要让要考试的提前预习课程了,提前预习, 今天讲了,防火墙,iptable.firewall-config,firewall-cmd 防火墙和网卡的配置方法,四种,1配置文件方法,主要开启 ...
- c++模板笔记
使用vc2015进行C++ 模板的学习实验和笔记 用简单示例学习了解STL template大部头理论书 讲解各种规则和各种规则例外的解决办法 集中精力在20%的规则中的阴暗角落而不是80%实践中要注 ...
- django by example 第四章 dashboard处html无法渲染问题
描述: 实现django by example 代码时,第四章 dashboard处html无法渲染问题. 此时报错,NoReverseMatch at /account/login/, Error ...