算法笔记_034:大整数乘法(Java)
目录
1 问题描述
计算两个大整数相乘的结果。
2 解决方案
2.1 蛮力法
package com.liuzhen.chapter5;
import java.math.BigInteger;
public class BigNumber {
/*
* 参数A:进行乘法运算的大整数A,用字符串形式表示
* 参数B:进行乘法运算的另一个大整数B,用字符串形式表示
* 函数功能:以字符串形式返回A*B的结果
*/
public String getMultiBigNumber(String A,String B){
if(A.length() > B.length()){ //当B字符串长度小于A时,在B字符串前补0,使得两个字符串长度一致
char[] temp = new char[A.length()-B.length()];
for(int i = 0;i < A.length() - B.length();i++)
temp[i] = '0';
B = String.valueOf(temp) + B;
}
if(A.length() < B.length()){ //当A字符串长度小于B时,在A字符串前补0,使得两字符串长度一致
char[] temp = new char[B.length()-A.length()];
for(int i = 0;i < B.length() - A.length();i++)
temp[i] = '0';
A = String.valueOf(temp) + A;
}
int len = A.length() + B.length();
char[] arrayA = A.toCharArray();
char[] arrayB = B.toCharArray();
for(int i = 0;i < arrayA.length;i++) //检查字符串A中是否有非数字的字符
if(arrayA[i] < '0' || arrayA[i] > '9')
return null;
for(int i = 0;i < arrayB.length;i++) //检查字符串B中是否有非数字的字符
if(arrayB[i] < '0' || arrayB[i] > '9')
return null;
char[] result = new char[len]; //用于存放最终乘法运算结果,长度len表示A*B的最长长度
for(int i = 0;i < len;i++) //初始化字符数组result,各个元素均为'0'
result[i] = '0';
int countI = 0; //用于计算当前B中已经和A中每个字符进行完乘法运算的字符个数
for(int i = arrayB.length-1;i >= 0;i--){
int tempB = arrayB[i] - '0';
int countJ = 0; //用于计算当前A中正在进行乘法运算的字符个数
for(int j = arrayA.length - 1;j >= 0;j--,countJ++){
int tempA = arrayA[j] - '0';
int tempRe = (tempB * tempA) % 10; //用于计算当前位置的数
int tempResult = result[(len-1-countJ)-countI] - '0'; //当前位置已包含的结果
tempResult += tempRe;
//count--表示当前A字符串中进行乘法运算的字符位置,countI表示当前B字符串中进行乘法运算的字符位置
//(count--)-countI则表示当前进行乘法运算两个数字结果的最低位的位置
result[(len-1-countJ)-countI] = (char) (tempResult%10 + 48); //当前位置数最终结果
int tempDi = tempB * tempA / 10 + tempResult / 10; //用于计算进位
for(int k = 1;tempDi > 0;k++){ //处理进位操作
//当前下第k个位置包含的结果
int tempResultK = result[(len-1-countJ)-countI-k] - '0';
tempResultK += tempDi;
result[(len-1-countJ)-countI-k] = (char) (tempResultK%10 + 48);
tempDi = tempResultK / 10;
}
}
countI++;
}
return getNoneZeroString(result);
}
//去掉字符串前面的0
public String getNoneZeroString(char[] result){
int count = 0;
for(int i = 0;i < result.length;i++){
if(result[i] == '0')
count++;
else
break;
}
char[] A = new char[result.length-count];
for(int i = 0;i < result.length-count;i++)
A[i] = result[count+i];
return String.valueOf(A);
}
public static void main(String[] args){
long t1 = System.currentTimeMillis();
BigNumber test = new BigNumber();
String A = "123456789123232342432423441345342523452534235443253254";
String B = "987654322234242424332423414324532542354325235345435435";
System.out.println("大整数A*B的结果:"+test.getMultiBigNumber(A, B));
BigInteger bigInteger1 = new BigInteger("123456789123232342432423441345342523452534235443253254");
BigInteger bigInteger2 = new BigInteger("987654322234242424332423414324532542354325235345435435");
bigInteger2 = bigInteger2.multiply(bigInteger1);
System.out.println("验证后A*B的结果:"+bigInteger2);
long t2 = System.currentTimeMillis();
System.out.println("耗时:"+(t2-t1)+" 毫秒");
}
}
运算结果:
大整数A*B的结果:121932631386721831198089710747298668585104317165230580938992491445929653074852215402191571860797295610655490
验证后A*B的结果:121932631386721831198089710747298668585104317165230580938992491445929653074852215402191571860797295610655490
耗时:4 毫秒
算法笔记_034:大整数乘法(Java)的更多相关文章
- [大整数乘法] java代码实现
上一篇写的“[大整数乘法]分治算法的时间复杂度研究”,这一篇是基于上一篇思想的代码实现,以下是该文章的连接: http://www.cnblogs.com/McQueen1987/p/3348426. ...
- 【老鸟学算法】大整数乘法——算法思想及java实现
算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
- OpenJudge 2980 大整数乘法
链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...
- 大整数乘法python3实现
因为python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,可是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...
- Java实现大整数乘法
1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import java.math.BigInteger; publi ...
- 大整数乘法(Comba 乘法 (Comba Multiplication)原理)
Comba 乘法以(在密码学方面)不太出名的 Paul G. Comba 得名.上面的笔算乘法,虽然比较简单, 但是有个很大的问题:在 O(n^2) 的复杂度上进行计算和向上传递进位,看看前面的那个竖 ...
- JS实现大整数乘法(性能优化、正负整数)
本方法的思路为: 一:检查了输入的合法性(非空,无非法字符) 二:检查输入是否可以进行简单计算(一个数为 0,1,+1,-1) 三:去掉输入最前面可能有的正负符号,并判断输出的正负 四:将输入的值分成 ...
随机推荐
- 我的OI生涯 第七章 终篇
11.10日. 我们TSOI再次来到了熟悉的燕山大学,只不过这次是真刀真枪的干了. 望着那座熟悉的小桥,身边的好友不知此行过后还有多少. 下午才到,出人意外的是这次没有住燕大宾馆而是选择了熟悉的格林豪 ...
- NOIP2017 D1T2时间复杂度
这道题在考试时看到感觉与第一题放反了位置(因为我还没有看到第一题是结论题) 对于每个语句进行栈的模拟,而如果有语法错误就特判. 对于每一条for语句我们将其与栈顶元素连边,复杂度是1的我们不用考虑,如 ...
- [HDU4609]3-idiots(生成函数+FFT)
3-idiots Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- poj 2912 并查集(食物链加强版)
题目:给出n个人玩剪刀石头布的游戏,其中有一个人是裁判,剩下的人分为3组,每一组的人只出某一种手型,裁判可以任意出.问是否能判断出哪个人是裁判 链接:点我 分分钟看吐血,先把食物链看懂吧 枚举裁判,然 ...
- 线段树--codevs 1690 开关灯
codevs 1690 开关灯 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description YYX家门前的街上有N(2& ...
- trie--- POJ 3764 The xor-longest Path
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5453 Accepted: 1 ...
- hdu 5211 Mutiple 数学
Mutiple Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5211 ...
- iframe里面的页面调用父窗口,左右窗口js函数的方法
iframe里面的页面调用父窗口,左右窗口js函数的方法 实现iframe内部页面直接调用该iframe所属父窗口自定义函数的方法. 比如有A窗口,A内有个IFRAME B,B里面的装载的是C页面 ...
- MatLab角点检測(harris经典程序)
http://blog.csdn.net/makenothing/article/details/12884331 这是源博客的出处,鄙人转过来是为了更好的保存!供大家一起学习!已将原始的博客的文章的 ...
- hdu 1272 小希的迷宫(java实现)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...