java中不用BigInteger实现大数据的乘法操作

昨天看到一个题目:计算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")));
	}
}
时间: 2024-10-01 21:48:03

java中不用BigInteger实现大数据的乘法操作的相关文章

Java中的BigInteger在ACM中的应用

Java中的BigInteger在ACM中的应用 在ACM中的做题时,经常会遇见一些大数的问题,这是当我们用C或是C++时就会觉得比较麻烦,就想有没有现有的现有的可以直接调用的BigInter,那样就方便很多啦.在java中就有的,所以在这儿我就做一个简要的介绍吧 -:在java中的基本头文件(java中叫包) import java.io.* importjava.util.*       我们所用的输入scanner在这个包中 importjava.math.*          我们下面要

java中的三(四)大特性

java中的三(四)大特性 :继承 . 封装 .多态.(抽象) 类与类之间的关系: is-a                   继承 .实现 继承的表现:使用extends继承父类 实现的表现:使用importance实现接口 has-a                组合 .聚合.关联 关联的表现:关联关系一般使用成员变量来实现. use-a (need-a)  依赖 依赖的表现,一个类的方法操作另一个类的对象 例如:人(Person) 开 车(Car) 继承 使用extends关键词  子

java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)

一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start=System.currectTimeMillis() ,long stop=System.currectTimeMillis() , stop-start; 二  有关大数据的运算及精确数字运算. 此时integer不适用.我们使用BigInteger ,如:BigInteger B= new Bi

有java基础,如何学习大数据,该怎么开始?

因为学大数据前期的基础课程就是java和linux.既然你有java基础就省去了学习者部分课程的基础,而且上手会容易很多! 再说说还需要学习哪些大数据技术,可以按我写的顺序学下去. 我还是要推荐下我自己创建的大数据资料分享群142973723,这是大数据学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习大数据资料和入门教程. Hadoop 这是现在流行的大数据处理平台几乎已经成为大数据的代名词,所以这个是必学的.Hadoop里面包括几个组件HDFS.

底层战详解使用Java开发Spark程序(DT大数据梦工厂)

Scala开发Spark很多,为什么还要用Java开发原因:1.一般Spark作为数据处理引擎,一般会跟IT其它系统配合,现在业界里面处于霸主地位的是Java,有利于团队的组建,易于移交:2.Scala学习角度讲,比Java难.找Scala的高手比Java难,项目的维护和二次开发比较困难:3.很多人员有Java的基础,确保对Scala不是很熟悉的人可以编写课程中的案例预测:2016年Spark取代Map Reduce,拯救HadoopHadoop+Spark = A winning combat

利用java中的BigInteger实现进制转换

[原创] java中的进制BigInteger十分的强大,而且好用,他可以表示任意大的整数,同时还可以进行进制转换,十分的方便, 代码示例: 1 package com.jiajia.demo_1; 2 import java.math.BigInteger;//导入该包 3 public class Demo { 4 public static void main(String[] args) { 5 String str = new BigInteger("15", 10).toS

我是学Java的,想尝试大数据和数据挖掘,该怎么规划学习?

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:谭欣链接:http://www.zhihu.com/question/21380122/answer/22156159来源:知乎 大数据有两个方向,一个是偏计算机的,另一个是偏经济的.你学过Java,所以你可以偏将计算机 基础1. 读书<Introduction to Data Mining>,这本书很浅显易懂,没有复杂高深的公式,很合适入门的人.另外可以用这本书做参考<Data Mining : Concepts

java中的BigInteger

头文件 import java.io.*; import java.math.*; 读入 Scanner cin = Scann(System.in); while(cin.hasNext()) <-> !=EOF n = cin.nextInt(); <-> 读入一个int数 n = cin.nextBigInterger(); <-> 读入一个大整数 输出 System.out.println(n);    //打印n System.out.println();  

Java中的基本类型转换,数据溢出原理

java中的数据类型 java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小. 基本数据类型中,各数据类型所表示的范围也是不一样的,如下所示: 由于在java中,整数默认是采用int型,浮点数默认采用的是double型进行存储,所以在定义long型和float型数据时,必须在数值后面加'l','L'和'f','F',如: 1 long a = 1000l; 2 long b = 2000L; 3 float c