参考博客:JAVA大数—基本操作模板
参考博客:java大数例题
前提:为了应付某些数据大的惊人的题,并以最简单的方式解决,我想到了JAVA大数,因此这篇文章我仅针对有关大数运算的题(😀顺便说一下我先前完全没有了解过JAVA,现在只想了解如何使用这个便捷的工具,因此本文绝对不是什么拓展)
(👇以下引用博客阐述👇)
介绍
java中用于操作大数的类主要有两个,一个是BigInteger,代表大整数类用于对大整数进行操作,另一个是BigDecimal,代表高精度类,用于对比较大或精度比较高的浮点型数据进行操作。因为这两种类的使用方法是一样的,所以下面我们以BigInteger为例进行讲解
基本用法
1、初始化一个值为123的大整数对象(ps:大数运算只能在大数之间,整型和大数之间不能直接运算,这就是此操作的必要性)
BigInteger a=new BigInteger(“123”); //第一种,参数是字符串
BigInteger a=BigInteger.valueOf(123); //第二种,参数可以是int、long
例如:如果要求2^n 必须先把2转化成大数型, BigInteger a = new BigInteger(“2”)。
2、大整数的四则运算
a. add(b); //a,b均为BigInteger类型,加法
a.subtract(b); //减 法
a.divide(b); //除法
a.multiply(b); //乘法
3、大整数比较大小
a.equals(b); //如果a、b相等返回true否则返回false
a.comareTo(b); //a小于b返回-1,等于返回0,大于返回1
4、常用方法
a.mod(b); //求余
a.gcd(b); //求最大公约数
a.max(b); //求最大值
a.min(b); //求最小值
5、BigInteger中的常数
BigInteger.ZERO //大整数0
BigInteger.ONE //大整数1
BigInteger.TEN //大整数10
这个相当于C语言的头文件吧~
import java.math.BigInteger; 使用 BigInteger 都要用到的
import java.util.Scanner; 导 Scanner类,导入后才能使用它
拓展
在类中构造一个Scanner对象,其传入参数为System.in
读取键盘数据方法如下:
1、读取一行文本(可带空格),使用nextLine( )
2、读取一个单词,使用next( )
3、读取一个int数值,使用nextInt( )
4、读取一个double数值 ,使用nextDouble( )
5、读取一个 大数 ,使用nextBigInteger( )
例题
最简单的例子(两个大数相加,a+b)
package demo; JAVA的背包,死记
import java.math.BigInteger; 相当于导入头文件
import java.util.Scanner; 相当于导入头文件
public class HelloWorld JAVA的类,死记
{
public static void main(String[] args) 死记
{
Scanner sc = new Scanner(System.in); 输入用法的调用
BigInteger a,b,c;
System.out.println("请输入大数据:"); 输出用法的调用
a = sc.nextBigInteger();
b = sc.nextBigInteger();
c = a.add(b);
System.out.println("大数据信息如下:");
System.out.println("data::"+ c);
}
}
例题二
蓝桥杯真题,求 乘积尾零,用JAVA秒解
package demo;
import java.math.BigInteger;
import java.util.Scanner;
public class HelloWorld
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int num[] = JAVA的数组定义与 C/C++ 差不多
{5650,4542,3554,473,946,4114,3871,9073,90,4329,
2758,7949,6113,5659,5245,7432,3051,4434,6704,3594,
9937,1173,6866,3397,4759,7557,3070,2287,1453,9899,
1486,5722,3135,1170,4014,5510,5120,729,2880,9019,
2049,698,4582,4346,4427,646,9742,7340,1230,7683,
5693,7015,6887,7381,4172,4341,2909,2027,7355,5649,
6701,6645,1671,5978,2704,9926,295,3125,3878,6785,
2066,4247,4800,1578,6652,4616,1113,6205,3264,2915,
3966,5291,2904,1285,2193,1428,2265,8730,9436,7074,
689,5510,8243,6114,337,4096,8199,7313,3685,211};
BigInteger tmp = new BigInteger("0"); 初始化,后面接的是字符串
BigInteger sum = new BigInteger("1"); 初始化,后面接的是字符串
System.out.println("请输入大数据:");
for(int i = 0;i < 100;i ++) JAVA的 for 循环和 C/C++ 差不多
{
tmp = BigInteger.valueOf(num[i]); 初始化,只是后面接的是 int 型
sum = sum.multiply(tmp); 大数の相乘
}
System.out.println("大数据信息如下:");
System.out.println("sum::" + sum);
}
}
例题三
求阶层(居然可以秒出求到9080!!!要知道在 C/C++ 中连求个20都一卡一卡的)
package demo;
import java.util.Scanner;
import java.math.BigInteger;
public class HelloWorld
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
long num = cin.nextLong(); 先输入 long 型 变量
BigInteger ans = new BigInteger("1"); 定义大数 1 (用于递归)
while(num > 0)
{
ans = ans.multiply(BigInteger.valueOf(num)); 将 long 型 变量转换成大数
num -= 1; 再将 long 型 变量自减
}
System.out.println(ans); 最后输出大数
cin.close(); 释放内存
}
}
例题四
类似大斐波数,可以求到第100000项(蓝桥杯真题,求 数列求值,但蓝桥杯要求20190344项,这太大了,因此那题只能取模)
package demo;
import java.math.BigInteger;
import java.util.Scanner;
public class HelloWorld
{
public static void main(String args[])
{
Scanner cin=new Scanner(System.in);
BigInteger[] ans = new BigInteger[20190345];
int m=cin.nextInt();
ans[1] = BigInteger.valueOf(1);
ans[2] = BigInteger.valueOf(1);
ans[3] = BigInteger.valueOf(1);
for(int i = 4; i <= m; i++)
{
BigInteger tmp = ans[i - 3].add(ans[i - 2]);
ans[i] = ans[i - 1].add(tmp);
}
System.out.println(ans[m]);
}
}
其实吧,我从下载JDK,配置环境,再到下载 eclipse,搜索JAVA大数用法,最后敲一遍代码,并写进这篇博客,共花了我整整一天的时间(收获满满),但是我心态却有所改变了,一开始是抱着万一比赛时遇到大数题就用JAVA暴力运算,但现在我只想好好研究 C/C++ 的数据结构与算法(认真刷题),不是因为JAVA大数不好,而是因为按照我目前的进度不可能很快理解其原理并同时运用到题目中去,况且JAVA大数也有很多细节我不容易注意到,真正比赛时可能会花费很多时间去Debug,还有JAVA还涉及到package、class、import 与 所需的常用数据库,短期是需要花费很大记忆量的(而长期又没这个时间成本),相比之下我觉得先把 C 的数据结构与语法 和 C++ 的类 与 stl库 掌握才是最优解(当然对于比赛也有另外的奇淫技巧,如蓝桥杯的 Excel 和 记事本)(逃