Java 大数类BigInteger与BigDecimal详细介绍(配蓝桥杯例题讲解)

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.mate包中的两个很有用的类:BigInteger与BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

1.基本函数

1.1 java.math.BigInteger.valueOf(long val)

将参数转换为制定的类型,返回一个BigInteger,其值等于指定long。这种“静态工厂方法”优先于(long)构造函数提供的,因为它允许为经常使用的BigIntegers重用。

 比如
 int a=3;
 BigInteger b=BigInteger.valueOf(a);
 则b=3;
 String s="12345";
 BigInteger c=BigInteger.valueOf(s);
 则c=12345;

还可以使用BigInteger.valueOf(long val)计算n的阶乘

import java.math.BigInteger;
import java.util.Scanner;
 
public class Main {
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		while(scan.hasNext())
		{
			int n=scan.nextInt();
			BigInteger ans=BigInteger.valueOf(1);
			for(int i=1;i<=n;i++)
				ans=ans.multiply(BigInteger.valueOf(i));//ans.multiply或者ans.add必须赋值给ans,不能直接写ans.multiply!只是一个值
			System.out.println(ans);
		}
	}
}

2.运算法则

2.1 基本运算

这两种数据类型不能使用人们熟悉的算术运算符(加减乘除等)而需要使用大数值中的一些方法来代替,下面进行详细讲解。

(1).add(); 大整数相加

(2).subtract(); 相减

(3).multiply(); 相乘

(4).divide(); 相除取整

(5).remainder(); 取余

(6).pow(); a.pow(b)=a^b

(7).gcd(); 最大公约数

(8).abs(); 绝对值

(9).negate(); 取反数

(10).mod(); a.mod(b)=a%b=a.remainder(b);

(11).max();

(12).min();

举一个简单的小栗子,其他的请读者自行练习

public static void main(String args[]) {
	BigInteger a=new BigInteger("23");
	BigInteger b=new BigInteger("34");
	System.out.println(a.add(b));
}

程序输出为:57

2.2 compareTo(BigInteger other)方法

这是一个比较字符串的方法,如果这个大整数与一个大整数other相等,返回0;
如果这个大整数小于两个大整数other,返回负数;
否则返回正数。

2.3 boolean equals();

判断两个大整数是否相等

2.4 BigInteger构造函数:

2.4.1 BigInteger(String val);

将指定字符串转换为十进制表示形式;

2.4.2 BigInteger(String val,int radix);

将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

第一个参数是一个数字字符串,第二个参数是几进制,栗子如下:

System.out.println(new BigInteger("110", 2));
System.out.println(new BigInteger("110", 8));
System.out.println(new BigInteger("110", 10));
System.out.println(new BigInteger("1e2c3d", 16));

结果:
6
72
110
1977405

3.基本常量

A=BigInteger.ONE 1

B=BigInteger.TEN 10

C=BigInteger.ZERO 0

4.基本操作

读入:

用Scanner类定义对象进行控制台读入,Scanner类在java.util.*包中

Scanner cin=new Scanner(System.in);// 读入
while(cin.hasNext()) 
{
   int n;
   BigInteger m;
   n=cin.nextInt(); //读入一个int;
   m=cin.BigInteger();//读入一个BigInteger;
   System.out.print(m.toString());
}

5.蓝桥杯试题

##第九届蓝桥杯第三题:复数幂

5.1 题目描述

设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。
求(2+3i)^123456 等于多少?即(2+3i)的123456次幂,这个数字很大,要求精确表示。
答案写成 “实部±虚部i” 的形式,实部和虚部都是整数(不能用科学计数法表示),中间任何地方都不加空格,实部为正时前面不加正号。(2+3i)^2 写成: -5+12i,
(2+3i)^5 的写成: 122-597i 注意:需要提交的是一个很庞大的复数,不要填写任何多余内容。

5.2 考点

大数类,文件输出

5.3 代码实例

import java.io.*;
import java.math.BigInteger;
 
public class Main {
 
	public static void main(String[] args) throws FileNotFoundException {
			PrintStream ps=new PrintStream(new FileOutputStream("C:\\MyEclipse\\file\\ppp.txt"));
	        System.setOut(ps);  //文件输出
		int n=123456;
		BigInteger a=new BigInteger("2");
		BigInteger b=new BigInteger("3");
		BigInteger a1=new BigInteger("2");
		BigInteger b1=new BigInteger("3");
		for(int i=1;i<n;i++) {
			BigInteger ta=a;
			a=a.multiply(a1).subtract(b.multiply(b1));//a=a*a1-b*b1;
			b=ta.multiply(b1).add(b.multiply(a1));//b=a*b1+b*a1
		}
		System.out.println(a+(b.compareTo(BigInteger.ZERO)>0?"+":"")+b+"i");
	}

5.4 结果

因为myeclipse控制台会炸的,所以要以文件的形式输出
在这里插入图片描述
一共135k的文件就对了,剩下的请读者们按照代码自己打一下

5.5 代码讲解

  1. PrintStream ps=new PrintStream(new FileOutputStream(“C:\MyEclipse\file\ppp.txt”));
    黄色标记的部分是你想要输出到哪个文件的目录下,
  2. b.compareTo(BigInteger.ZERO)>0这句代码的意思是:b是否大于0
  3. (b.compareTo(BigInteger.ZERO)>0?"+":"")+b:如果大于零b的前面就添加一个加号,否则b的前面就为空
    如果不写这一行代码的话,当n的值等于2的时候,输出结果为:-512i而不是-5+12i
    它的作用是,当一个数是整数时要加加号

5.6 详细讲解文件输出

方法一:

这两行代码方可解决
PrintStream ps=new PrintStream(new FileOutputStream(“C:\MyEclipse\file\wlllrk.txt”));
System.setOut(ps); //文件输出

方法二:
1.在你想要运行的程序上右键–> Run As --> Run Configurations
在这里插入图片描述
2.选择Common窗口,设置文件保存路径,以及是否以追加方式保存console输出到文件。

在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁同学与Android

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值