昨天看到一个题目:计算1234!,不能用BigInteger类
众所周知阶乘的数据会很大,常用的int和long型根本不够用。一般想到的只有BigInteger类,但是题目中明确说了不能用,所以只能想其它办法。
阶乘其实就是乘法的递归,这道题目可以简化为如何实现大数据的乘法,int和long型都装不下的数据,只能用String来表示,所以只要实现了两个String表示数字的乘法就可实现题目要求。
想想我们自己手算乘法的步骤,基本都是列一个竖式,分别按位相乘,进位的数相加。。只要用程序将这个过程模拟出来,就ok了。
列竖式的时候把一个数分成个十百千位。。其实就等同于整型数组。。弄清楚了这些,就可以写代码了。
package cn.baokx;
public class Training{
public static int [] multi(String str1, String str2) {
//将接收到的字符串转化成倒序的char数组
StringBuffer buffer = new StringBuffer();
buffer.append(str1);
char[] nums1 = buffer.reverse().toString().toCharArray();
buffer.setLength(0);
buffer.append(str2);
char[] nums2 = buffer.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应用import java.util.Scanner; import java.math.BigInteger; public class Main{ public static void main(String[]args){ Scanner in=new Scanner(System.in); while(in.hasNext()){//has....
BigInteger不是基本数据类型之一,它其实更像String,是Java里的一个类,然而它的初始化方式却没有String那么方便可以直接赋值,而是跟其他自定义的类一样,要调用它的构造器进行初始化。
JAVABigInteger包.pdf
使用BigInteger类实现,实现了RSA的加解密
用java的biginteger实现的poj1001,比较简单的方法
用java写的BigInteger,主要是实现一个内库
java练习_大数运算_BigInteger.pdf
大整数 为Java实现BigInteger
使用时导包:java.math.BigInteger 作用:可以使用BigInteger操作大整数,也可以转换进制。如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类...
这是我自己写分子分母是采用Biginteger类的分数类期末Java期末项目,如有需改进的地方请提出。
BigInteger.java BigDecimal.java 文件 源代码
ipv6的ip地址转biginteger数字 直接能够测试
biginteger源码笔记 The Java:trade_mark: Cryptography Architecture requires that Java security providers be code-signed (using a code-signing certificate issued by Oracle Corporation). OpenJDK does not...
import java.math.BigInteger; public class DemoInteger{ public static void main(String[] args) { //四则运算:BigInteger ⼤的数据的运算 BigInteger b1=new BigInteger("100000000000000000000000"); ...
java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等
浅析java.math.BigInteger构造过程.pdf
类似java里面的BigInteger类型,进行大数存储和计算!
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
Java数据类型和MySql数据类型对应一览
BigInteger的源代码,有英文注释