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

本文通过一个具体的阶乘计算问题,介绍了Java中处理大数的方法,包括BigInteger类型的使用技巧及其实现过程。从初始化到四则运算,再到比较大小和输入输出,全方位展示了大数类型在解决实际编程问题中的应用。
摘要由CSDN通过智能技术生成

引题:

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

}
}

附上结果图





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值