java中不用BigInteger实现超大整数的乘法操作
2017-04-27 17:31
555 查看
昨天看到一个题目:计算1234!,不能用BigInteger类
众所周知阶乘的数据会非常大,经常使用的int和long型根本不够用。一般想到的仅仅有BigInteger类,可是题目中明白说了不能用,所以仅仅能想其他办法。
众所周知阶乘的数据会非常大,经常使用的int和long型根本不够用。一般想到的仅仅有BigInteger类,可是题目中明白说了不能用,所以仅仅能想其他办法。
阶乘事实上就是乘法的递归。这道题目能够简化为怎样实现大数据的乘法,int和long型都装不下的数据,仅仅能用String来表示,所以仅仅要实现了两个String表示数字的乘法就可实现题目要求。
想想我们自己手算乘法的步骤。基本都是列一个竖式。分别按位相乘,进位的数相加。
。仅仅要用程序将这个过程模拟出来。就ok了。
列竖式的时候把一个数分成个十百千位。。
事实上就等同于整型数组。。弄清楚了这些。就能够写代码了。
package cn.baokx; public class BigIntMulti{ public static int [] multi(String str1, String str2) { //将接收到的字符串转化成倒序的char数组 char[] nums1 = new StringBuffer(str1).reverse().toString().toCharArray(); char[] nums2 = new StringBuffer(str2).reverse().toString().toCharArray(); //预先声明一个数组,用来存放各个位数相乘的结果(相似于列竖式) int len = nums1.length+nums2.length; int [] array = new int[len]; //模拟竖式计算 for(int i = 0 ; i < nums2.length ; i++){ for(int j = 0 ; j < nums1.length ; j++){ array[len-1-(i+j)] += (nums2[i]-48)*(nums1[j]-48); } } return array; } //对数组进行进位操作。以字符串的形式返回终于结果 public static String arrayFormat(int [] array){ for(int i = array.length-1 ; i > 0 ; i--){ array[i-1] += array[i]/10; array[i] = array[i]%10; } StringBuffer buffer = new StringBuffer(); if(array[0]!=0){ buffer.append(array[0]); } for(int i = 1 ; i < array.length ; i++){ buffer.append(array[i]); } return buffer.toString(); } //阶乘 public static String getFactorial(String num){ if("1".equals(num)){ return "1"; }else{ return arrayFormat(multi(num,getFactorial((Integer.parseInt(num)-1)+""))); } } public static void main(String[] args) { System.out.println(getFactorial("1234")); System.out.println(arrayFormat(multi("10","10"))); System.out.println(arrayFormat(multi("99","99"))); } }
相关文章推荐
- java中不用BigInteger实现超大整数的乘法操作
- 【java】BigDecimal、BigInteger、大数相乘、数值的整数次方、快速乘法
- 手算平方根和基于 Java BigInteger 的大整数平方根的实现
- 实现大位整数的加/减/乘法的java工具类
- 大整数乘法算法简单实现 java
- Java中BigDecimal 和 BigInteger 类型数据操作学习总结
- 【LeetCode-面试算法经典-Java实现】【008-String to Integer (atoi) (字符串转成整数)】
- 【Java】自从有了BigInteger,我再也不用担心要处理的数据有多大了
- java常用类库续2(大数操作BigInteger、BigDecimal类、对象克隆技术、Arrays类)
- java.BigInteger(java表示大整数)
- 【正整数模板运算(C++手写BigInteger类和java.math.BigInteger以及java.math.BigDecimal)】
- Divide Two Integers-不用'/' '*' '%'操作实现整数的除法
- 【LeetCode-面试算法经典-Java实现】【007-Reverse Integer(翻转整数)】
- Java BigInteger sqrt方法的实现
- 大整数乘法——算法思想及java实现
- 大正整数乘法(非BigInteger)及几种阶乘算法
- 一道面试题(C#实现了超大整数的加减乘法运算)
- Java BigInteger求任意n(n∈N*)次方根的实现
- 【Java BigInteger开方sqrt的实现】
- java 中如何处理大整数-java.BigInteger的使用