ACM中常见Java大整数(持续更新)

    首先打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));
	}
}

 

你可能感兴趣的:(java学习)