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

引题:

•思考如下题目:
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));

}
}

附上结果图





阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页