- 浏览: 434872 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
qja:
Iterator.remove()这个方法也会出错的。
java.util.ConcurrentModificationException 出现的原因和解决办法 -
angeli:
List<String> save = new A ...
java.util.ConcurrentModificationException 出现的原因和解决办法 -
大峰子:
灰常感谢 刚好碰到这个问题, 搜了好多都没找到解决方法
python学习笔记-Python交互模式下方向键出现乱码 -
anypwx:
牛哥,怎么找到的,解决了我的报错问题,谢谢
JSONObject NestableRuntimeException -
tp7300:
确实好很多了,谢谢博主。
Failed to install on device 'emulator-5554': timeout
计算大数:1234567891011121314151617181920 X 2019181716151413121110987654321?
计算结果:2492816912877266687794240983772975935013386905490061131076320; length=61
验证结果:2.4928169128772666E60
源代码如下:
/** * 计算大数相乘 * @author zhoujianghai * zhoujiangbohai@163.com */ public class BigNumberCount { public static void main(String agrs[]){ String number1 = "1234567891011121314151617181920"; String number2 = "2019181716151413121110987654321"; String result = multipBigNumber(number1,number2); System.out.println("计算结果:"+result+"; length="+result.length()); System.out.println("验证结果:"+Double.parseDouble(number1) * Double.parseDouble(number2)); } public static String multipBigNumber(String s1,String s2){ int longArray[] = null; int shortArray[] = null; int s1Length = s1.length(); int s2Length = s2.length(); int longLength = s1Length > s2Length ? s1Length : s2Length; int shortLength = s1Length == longLength ? s2Length : s1Length; longArray = new int[longLength]; shortArray = new int[shortLength]; String longString = s1Length >= s2Length ? s1 : s2; String shortString = s1.equals(longString) ? s2 : s1; System.out.println("longString="+longString+"; shortString="+shortString); //低位在前,高位在后 for(int i = longLength - 1; i >= 0; i --){ longArray[longLength - 1 - i] = longString.charAt(i) - 48; } for(int i = shortLength - 1; i >= 0; i --){ shortArray[shortLength - 1 - i] = shortString.charAt(i) - 48; } StringBuffer results[] = new StringBuffer[longLength]; for(int i = 0; i < results.length; i++) { results[i] = new StringBuffer(); } StringBuffer resultBuffer = new StringBuffer(); /** * 把被乘数的每一位与乘数逐位相乘 * 如:5607 * 2256,被乘数5607,乘数2256 * 7 * 6 + 0 = 42 :0表示低位向高位的进位 7 * 5 + 4 = 39 7 * 2 + 3 = 17 7 * 2 + 1 = 15 29751 0 * 6 + 0 = 0 0 * 5 + 0 = 0 0 * 2 + 0 = 0 0 * 2 + 0 = 0 00000 6 * 6 + 0 = 36 6 * 5 + 3 = 33 6 * 2 + 3 = 15 6 * 2 + 1 = 13 63531 5 * 6 + 0 = 30 5 * 5 + 3 = 28 5 * 2 + 2 = 12 5 * 2 + 1 = 11 08211 * results:29751, 00000,63531,08211 * */ for(int i = 0; i < longLength; i ++){ int temp = 0; int tempCarry = 0;//低位向高位的进位 int currentValue = 0; //当前位乘积的值 for(int j = 0; j < shortLength; j ++){ temp = longArray[i] * shortArray[j] + tempCarry; //System.out.println("longArray[i]="+longArray[i]+" * "+"shortArray[j]="+shortArray[j]+" + "+tempCarry+" = "+temp); tempCarry = temp / 10; currentValue = temp % 10; results[i].append(currentValue); if(j == shortLength - 1){ results[i].append(tempCarry);//最高位有进位则进位,无进位则补0 } } System.out.println( results[i].toString()); } /**低位补0,results[i]低位补i个0(低位在前,高位在后) * 29751 000000 0063531 00008211 * */ for(int i = 0,length = results.length;i < length; i++){ String temp = ""; for(int j = 0; j < i; j ++){ temp += "0"; } results[i].insert(0, temp); System.out.println( results[i].toString()); } /**把每一行相加(低位在前,高位在后,从左往右 加) * 29751 000000 0063531 00008211 ------------- 29394621 * * */ int tempCarry = 0; int currentValue = 0; StringBuffer lastBuffer = results[results.length - 1]; //需要循环的次数 int times = lastBuffer.length(); for(int i = 0; i < times; i ++ ){ int temp = 0; for(int j = 0,length2 = results.length; j < length2; j ++){ if(results[j].length() > i){ temp += (results[j].charAt(i) - 48);//把第j行的第i位的字符转换成int } } temp += tempCarry; tempCarry = temp / 10; currentValue = temp % 10; resultBuffer.append(currentValue); } StringBuffer finalResult = new StringBuffer(); boolean hasNumNotZero = false; //因为低位在前,高位在后,所以把29394621 转换成最终结果:12649392 for(int i = resultBuffer.length() - 1; i >= 0; i --) { int temp = resultBuffer.charAt(i) - 48; if(temp != 0) hasNumNotZero = true; if (hasNumNotZero) finalResult.append(temp); } if (finalResult.length() == 0) finalResult.append(0); return finalResult.toString(); } }
转帖请注明出处:
http://zhoujianghai.iteye.com/blog/1168264
评论
2 楼
zhoujianghai
2012-06-25
faulware 写道
本以为这么长的代码 肯定考虑了结果位数的问题,结果.... StringBuffer results[] = new StringBuffer[longLength]; 那么13*9结果是2位数吗???
多谢指出错误,是循环的次数times弄错了,不需要减1,已纠正。不过StringBuffer results[] = new StringBuffer[longLength]这行代码是没有错误的,这个results里存储的不是结果的位数,是两数逐位相乘的结果,看看代码里的注释。results:29751, 00000,63531,08211 。
1 楼
faulware
2012-06-25
本以为这么长的代码 肯定考虑了结果位数的问题,结果.... StringBuffer results[] = new StringBuffer[longLength]; 那么13*9结果是2位数吗???
发表评论
-
solr学习笔记-linux下配置solr
2012-05-26 20:03 7871本文地址: http://zhoujianghai. ... -
教你如何迅速秒杀掉:99%的海量数据处理面试题
2012-05-07 13:50 2052转载自:http://blog.csdn.net/wangf ... -
关于javac编译时出现“非法字符:\65279”的解决方法
2012-04-12 11:25 1862一些文本编辑软件在保存一个以UTF-8编码的文件时 ... -
UrlConnection连接和Socket连接的区别
2011-10-14 15:22 7071关于UrlConnection连接和Socket连接的区别,只 ... -
火车运煤问题
2011-10-09 15:16 1574下面是一个比较经典的智力题:你是山西的一个煤老板,你在矿区开采 ... -
搜狗的一道关于加密解密的在线测评题目
2011-10-01 15:04 1576是一个信息编码的程序,阅读其encode部分,并补全其deco ... -
java实现快速排序
2011-09-08 11:00 1297/** * 快速排序 * @author zho ... -
java.util.ConcurrentModificationException 出现的原因和解决办法
2011-05-12 17:03 39235用iterator遍历集合时碰到java.util.Co ... -
Java:ArrayList和LinkedList区别
2011-02-15 16:30 1553一般大家都知道ArrayList ... -
java.lang.LinkageError: loader constraint violation: when resolving interface...
2010-10-06 22:12 2319java.lang.LinkageError: load ... -
JAVA多线程
2010-08-07 14:46 1033多线程 线程:是指进程中的一个执行流程。 线程与进程的区别 ... -
struts2常量详解
2010-06-11 08:55 1626struts2的配置文件之struts ... -
深入Java虚拟机:JVM中的Stack和Heap
2010-05-16 15:02 1077在JVM中,内存分为两个部分,Stack(栈)和Heap(堆) ... -
关于java的作用域protected
2010-05-10 19:54 1894在某个类中定义的protected 方法和属性和默认权限方法和 ... -
关于org.springframework.security.AccessDeniedException: Access is denied
2010-05-06 19:34 7625在做系统权限管理时使用了springsecurity,出现了如 ... -
struts2的struts.xml文件中package里的元素排列顺序
2010-04-22 09:52 1861package里元素必须按照一定的顺序排列,排列顺序如下: ... -
struts2自定义404错误页面
2010-04-21 17:50 5296以前做的一个网站,最近服务器后台出现一些异常,问题是客户访问一 ... -
hibernate的主键生成策略(generator)详解
2010-04-14 09:30 1752assigned” 主键由外 ... -
ssh开发关于struts2,action中方法执行两次的问题
2010-04-10 20:58 2318前段时间发现了一个很奇怪的问题,我的项目中关于action中的 ... -
org.hibernate.hql.ast.QuerySyntaxException: xx is not mapped [sql语句]
2010-04-08 10:06 2187今天一时大意,写了下面这条查询语句 final String ...
相关推荐
java实现大数相乘,在不使用BigInteger工具方法的前提下进行大数相乘运算。
本程序可以求出:任意位的两个大数相乘的结果。 已经实验过>2000位的两数相乘,有兴趣的话,你也试一试吧。 support me!thanks!
大数相乘算法,java代码,包含独立大数相加算法 其中bigNumberPlus(String s1,String s2)为大数相加方法 bigNumberMultiply(String s1,String s2)为大数相乘方法
JAVA实现的两个特大整数相乘的算法,可以达到1000位数相乘。
两个大数相乘:利用数组实现,数组a存放大数1的每一位,数组b依次存放大数2的每一位。如:一大数1为3463546,则数组 a[]={3,4,6,3,5,4,6},大数2为:89019 则数组b[]={8,9,0,1,9},现在要大数1和大数2相乘,并按数位...
NULL 博文链接:https://aa00aa00.iteye.com/blog/2303318
在计算机语言中,整数最大可以设置为unsigned long类型的,但是表示有限,当涉及到两个大整数相乘的时候,会出现不能表示的情况,鉴于此编制此算法予以解决大整数相乘。本程序使用分治法实现,将n位二进制整数X和Y都...
大整数分解问题:给定两个n位长二进制数x和y,求这两个数的乘积。时间复杂性控制在Θ(n1.6)
大数乘法可以进行任意大小和精度的整数和浮点数的乘法运算, 精确度很高, 可以用作经融等领域的计算,这个是我看了一些资料, 然后自己整理实现的,简单测试了一下
包含模拟手工算大数相加、大数相乘(大数=越位的数)
通过使用分治的思想解决大数相乘的问题,资源中仅为一个java类
本文以C++语言设计了大整数类,在类中以数组存储大整数,同时借鉴分治算法思想实现了大整数的乘法运算。算法中将被乘数与乘数按照相同位数进行分组,通过对每组较小数值整数进行乘法和加法运算而得到大整数相乘的积...
华中科技大学算法实验,包含大数相乘,二分查找树,最近点对和floyd算法
为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。 目前绝大多数官方支持库均已支持...