java学习——大数类型的简单使用方法 Biginteger Bigdecimal

原创 2018年04月16日 18:33:00

引题:

•思考如下题目:
n!的阶乘最右边的那个非0数字(n<=100
例如:
4!=24    4
5!=120  2
6!=720  2
7=50404
思路:
n=5开始最右边一直有0(因为前面的因子里面包含10只要找到最右边第一个非0
难点:一般数据类型存储不了这么大的数
Int       最大是2^324亿
long     最大是2^64 10^19
30!就达到了10^32

解决方案:Java的大数类型

如何解决装不下的问题

Java的新类型——大数类型Biginteger (大整数)Bigdecimal(大浮点数)

它并不是基本数据类型,实际上是一个类,类似String,把它的成员变量和方法封装在一起

不能直接用+- * / %符号进行加减运算,但可以调用它的加减乘除取余等函数

理论上可以装无限大的数,只要计算机内存够用。

只需要学会大数的使用方法,再将之前的代码改造一下,类型换一下,问题就解决了

大数的使用1


import java.math.BigInteger;

需要导入此包才能使用

定义一个大数

BigInteger n

直接初始化

BigInteger sum=new BigInteger("11234455675757657567657");

用字符串String初始化

Strings="12345678911111111111111111";

BigInteger n=new BigInteger(s);

技巧:使用alt+/查看类的成员和函数有哪些

大数的使用2

.valueof()初始化

BigInteger n0=BigInteger.valueOf(123);//这种形式,括号里的数不能超过long的最大值)

.valueof()进行赋值和转化

inta=123456

n0=BigInteger.valueOf(a);//int型转为大数

大数的使用3

  .add( )

BigInteger n1=new BigInteger("57657567657");

BigInteger n2=new BigInteger(“123123123123");

n1.add(n2);

  .subtract()

.n1.subtract(n2);

  .multiply()

n1. multiply(n2); 

整除.divide()

取模.remainder()  //与上面用法类似

大数的使用4

比较.compareTo()

a.compareTo(b)的返回值

0  ab相等

>0  a大于b

<0  a小于b

If( a.compareTo(b) == 0 ) System.out.println(“a == b”); //大整数a==b

Else if( a.compareTo(b) > 0 ) System.out.println(“a > b”); //大整数a>b

Else if( a.compareTo(b) < 0 ) System.out.println(“a < b”); //大整数a<b

思考:为什么不能直接用a==b来比较?而必须要用成员函数

因为这是类,类名是引用类型 是地址 a==b比较的是它两引用的地址是否相同

所有,就算a b内容一样,但由于是不同的地址 结果还是不相等的 是0

大数的使用5

大数的输入和输出

Scanner cin=newScanner(System.in);

BigInteger n=cin.nextBigInteger();

System.out.println(n);

更多

Bigdecimal与Biginteger 的使用方法完全一致,不再重复。

以上仅仅是简单的介绍,大数的成员变量和成员方法不仅仅只有这些,有非常多,功能非常强大,如求绝对值.abs() 求两个值的最大 最小.max() .min() 等等,这里不一一介绍了 大家可以有需要可以自行百度


如果不用大数,思路比较简单的,但数会溢出,当n>=10,就会出现错误

import java.util.*;
public class problem7 {
public static void main(String[] args)
{
	Scanner cin=new Scanner(System.in);
	int n=cin.nextInt();
	int sum=1;
	for(int i=1;i<=n;i++)
	{
		sum*=i;
		
	}
	System.out.println("n!="+sum);
	while(sum%10==0)
	{
		sum=sum/10;
	}
	System.out.println("所取位:"+sum%10);

}
}

用大数进行改造后,可以装无限大的数,只要计算机内存够用。不会溢出。

import java.util.Scanner;
import java.math.*;
public class problem7a {
public static void main(String[] args)
{
	Scanner cin=new Scanner(System.in);
	int n=cin.nextInt();
	BigInteger sum=new BigInteger("1");
	BigInteger n0=new BigInteger("0");
	BigInteger n10=new BigInteger("10");
	for(int i=1;i<=n;i++)
	{	
		
		sum=sum.multiply(BigInteger.valueOf(i));
		
	}
	System.out.println("n!="+sum);
	while(sum.remainder(n10).compareTo(n0)==0)
	{
		sum=sum.divide(n10);
	}
	System.out.println("所取位:"+sum.remainder(n10));

}
}

附上结果图





windows NT事件日志说明

windows NT事件日志说明原作者:NtWak0翻译整理:补天-苏樱概要以下内容是关于WINDOWS NT事件日志的非常好的、深入的文章。 日志通常用审计机或某种工具来管理。这篇文章也包含:当一个...
  • yagami
  • yagami
  • 2000-12-01 19:26:00
  • 1378

Java高新技术——大数操作(BigInteger、BigDecimal)

本篇博客主要介绍Java常用类库之大数操作,主要是BigInteger和BigDecimal的API学习。之后介绍华为的一道历年真题,十六进制转换成十进制,我们可以看到题目中给我们设置的陷阱,以及如何...
  • zhongkelee
  • zhongkelee
  • 2016-08-23 11:08:38
  • 12795

java中biginteger和bigdecimal在大数计算中的使用

java中的BigInteger和BigIntegerDecimal 当我们在做Acm的大数题时,我们会发现int,double,表示的范围有限,不能够满足要求,对于c/c++而言,我们就只能采用数...
  • u013093547
  • u013093547
  • 2015-07-21 23:46:06
  • 2839

大数相加,相减,相除,相乘。。。java BigInteger BigDecimal

实习机试时有大数相加,前几天校招有大数相减的题。这种题c,c++可能会比较复杂,在java里却比较简单,因为已经有写好的类和方法供调用了。 在JAVA中有两个类BigInteger和BigDeci...
  • xiaobao1186
  • xiaobao1186
  • 2013-09-07 14:42:50
  • 3922

java 大数类 总结 整数小数(BigInteger和BigDecimal)

java大法好,退c保平安 看完java的大数类,决定重新做一下之前大数的题 然后再整理一下吧= = 整数部分(BigInterger) hdu 1001 求从1加到n,n可以很大 ...
  • Jeromiewn
  • Jeromiewn
  • 2016-11-10 21:17:15
  • 1724

java常用类库续2(大数操作BigInteger、BigDecimal类、对象克隆技术、Arrays类)

大数操作(BigInteger、BigDecimal) 大数操作:正常情况下一个整数最多只能放在long类型之中,但是现在如果有以下一个数字:1111111111111111111111111111...
  • cz1029648683
  • cz1029648683
  • 2011-08-07 14:27:29
  • 1846

JAVA基础再回首(十三)——BigInteger类、BigDecimal类、Date类、DateFormat类、Calendar类

JAVA基础再回首(十三)——BigInteger类、BigDecimal类、Date类、DateFormat类、Calendar类 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http:/...
  • m366917
  • m366917
  • 2016-08-18 00:01:07
  • 1190

Java之------大数(BigInteger,BigDecimal)

Java大数 1、java.math.BigInteger类 不可变的任意精度的整数。所有操作中,都以二进制补码形式表示。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供...
  • x121850182
  • x121850182
  • 2016-05-24 12:32:20
  • 425

JAVA常用类之——BigInteger和BigDecimal

JAVA常用类之——BigDecimal
  • fanwenjieok
  • fanwenjieok
  • 2015-07-20 13:07:26
  • 504

BigInteger和BigDecimal类

如果要进行非常大的数的计算或者高精度浮点值的计算,可以使用java.math包中的BigInteger类和BigDecimal类。它们都是不可变的。它们都扩展Number类且实现Comparable接...
  • yongchaocsdn
  • yongchaocsdn
  • 2016-11-26 18:41:30
  • 882
收藏助手
不良信息举报
您举报文章:java学习——大数类型的简单使用方法 Biginteger Bigdecimal
举报原因:
原因补充:

(最多只允许输入30个字)