首先打ACM为啥要用java?用其他语言不是一样嘛,为啥学了一种语言还要懂其它语言的一些知识点??,这里只是针对打ACM提出的观点,像什么工作之类的,这里不提,那为啥要学Java??不学python??因为我们不确定python能不能被用作一种提交语言,所以我们这里稍微学习一点java。
在程序编写的过程中,就我自己而言我认为c/c++比java好写一点(可能是我经常用的原因),但是在遇到大数问题的时候,java简直就是流氓处理,所以我们这里深入一点的学习一下Java大数
首先最基础的输入输出我就不在废话,如果有需要可以看下以前的博客衔接,里面还有java的多组T组输入下面开始大数。
首先跟C/C++一样你使用某一个函数或者功能时要先写它的头文件,这里用Java的大数时也要先弄一个类(Java中叫类),这里我们叫它头文件吧,然后开始使用。
大整数最基础的操作:
首先导入包:
import java.math.BigInteger;
或者
import java.math.*;
然后定义变量:
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a; a=cin.nextBigInteger(); System.out.println(a); } }
接下来是最基本的函数
加减乘除以及取模较大值较小值(注意这些函数使用对象均为同样的BigInteger数,所以如果我们只有整型数时还要改变数据类型
使用函数
a=BigInteger.ZERO;//默认为0 a=BigInteger.ONE;//默认为1 a=BigInteger.TEN;//默认为10 a=BigInteger.valueOf(101);//使用函数对大整数进行赋值
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a,b; a=cin.nextBigInteger(); b=cin.nextBigInteger(); System.out.println(a.add(b));//加 System.out.println(a.subtract(b));//减 System.out.println(a.multiply(b));//乘 System.out.println(a.divide(b));//除 System.out.println(a.mod(b));//取模 System.out.println(a.max(b));//输出较大值 System.out.println(a.min(b));//输出较小值 } }
下面是一些稍微常用的函数
Boolean函数isProbablePrime(int certainty)
输入一个数,如果这个数可能为素数,则返回 true,如果它一定为合数,则返回 false。如果 certainty <= 0,则返回 true。
certainty - 调用方允许的不确定性的度量。如果该调用返回 true,则此 BigInteger 是素数的概率超出 (1 - 1/2certainty)。此方法的执行时间与此参数的值是成比例的。
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a; a = cin.nextBigInteger(); System.out.println(a.isProbablePrime(1));//判断这个数是一定是合数 } }
boolean类型equals()函数
判断两个数是否相等相等返回true否则返回false
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a,b; a = cin.nextBigInteger(); b=cin.nextBigInteger(); System.out.println(a.equals(b)); } }
比较函数compareTo()
比较两个数的大小,如果相等返回0,a大于b返回1,a小于b返回-1
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a, b; a = cin.nextBigInteger(); b = cin.nextBigInteger(); System.out.println(a.compareTo(b)); } }
商与余数divideAndRemainder()
获得a/b与a%b这里由于是得到两个数,所以我们用一个数组存值
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a, b; a = cin.nextBigInteger(); b = cin.nextBigInteger(); BigInteger aa[]=a.divideAndRemainder(b); System.out.println(aa[0]+" "+aa[1]); } }
幂取余modPow(n,m),
计算a的n次幂并对m进行取余的函数
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a, b, n, m; a = cin.nextBigInteger(); n = cin.nextBigInteger(); m = cin.nextBigInteger(); System.out.println(a.modPow(n, m)); } }
相反数函数negate()
得到a的相反数
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a, b, n, m; a = cin.nextBigInteger(); n =a.negate(); System.out.println(n); } }
函数modInverse()
计算a的逆元mod m的值
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a, b, n, m; a = cin.nextBigInteger(); m = cin.nextBigInteger(); System.out.println(a.modInverse(m)); } }
取余函数remainder()
计算a对m取余的结果,前面有一个函数是取模函数mod(),这里取余和取模是有区别的,我在这个博客中讲到衔接
import java.util.Scanner; import java.io.BufferedInputStream; import java.math.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a,b; a=cin.nextBigInteger(); b=cin.nextBigInteger(); System.out.println(a.remainder(b)); } }
函数toString() toString(int x)
第一个是将大整数转化为十进制串输出形式输出,第二个是将大整数转化为x进制串输出
import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] agrs) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); BigInteger a,b; a=cin.nextBigInteger(); System.out.println(a.toString()); System.out.println(a.toString(2)); } }