JAVA

大整数

1
2
比较大小: a.compareTo(b): 小于返回-1,等于返回0,大于返回1
int/long转换: BigIntger a = BigInteger.valueOf(114514);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//来自https://blog.csdn.net/dlx_handsome/article/details/102529307
import java.util.*;
import java.math.BigInteger;
import java.math.*;
public class Main{
public static void main(String[] args) {
//随便打的两个数,不过用生成随机大整数不是更香嘛
BigInteger number1=new BigInteger("347238462384523623645237465237415234165234615246742354");
BigInteger number2=new BigInteger("42673547263541874637462394142837645");
//返回一个BigInteger,其值为该BigInteger的绝对值。
System.out.println("abs():"+number1.abs().toString());
//返回值为BigInteger (this / val)。
System.out.println("divide():"+number1.divide(number2));
//返回值为的BigInteger (this % val)。
System.out.println("remainder():"+number1.remainder(number2));
//返回值为的BigInteger (this + val)。
System.out.println("add():"+number1.add(number2).toString());
//返回值为的BigInteger (this << n)。
System.out.println("shiftLeft():"+number1.shiftLeft(1));
//返回值为的BigInteger (this >> n)。
System.out.println("shiftRight():"+number1.shiftRight(1));
//返回此BigInteger的signum函数 返回-1,0,1作为BigInteger的符号
System.out.println("signum():"+number1.signum());
//返回此BigInteger的整数平方根。
System.out.println("sqrt():"+number1.sqrt());
//返回值为的BigInteger (this & val)。
System.out.println("and():"+number1.and(number2));
//返回值为的BigInteger (this & ~val)。
System.out.println("andNot():"+number1.andNot(number2));
//返回此BigInteger的二进制补码表示形式中不同于其符号位的位数.
//此方法在此BigInteger,从它的符号位不同的补码表示返回的比特数
System.out.println("bitCount():"+number1.bitCount());
// 返回此BigInteger的最小2补码表示形式中的位数,不包括符号位。
System.out.println("bitLength():"+number1.bitLength());
//将其转换BigInteger为byte,以检查是否丢失了信息。如果超出了,会丢出一个ArithmeticException异常
//System.out.println("byteValueExact():"+number1.byteValueExact());
//返回一个BigInteger,其值等于该BigInteger,并且清除了指定的位。
System.out.println("clearBit:"+number2.clearBit(0));
//将此BigInteger与指定的BigInteger进行比较。
System.out.println("compareTo():"+number1.compareTo(number2));

//返回两个BigIntegers组成的数组,其中包含(this / val) 后跟(this % val)。
System.out.println("divideAndRemainder():"+Arrays.toString(number1.divideAndRemainder(number2)));
//将此BigInteger转换为double。
System.out.println("doubleValue():"+number1.doubleValue());
//将此BigInteger转换为float。
System.out.println("floatValue():"+number1.floatValue());
// 返回此BigInteger和的最大值val。
System.out.println("max():"+number1.max(number2));
//返回此BigInteger和的最小值val。
System.out.println("min():"+number1.min(number2));
//返回值为的BigInteger (this mod m)。
System.out.println("mod():"+number1.mod(number2));
//返回值为(this-1 的BigInteger mod m)。
System.out.println("modInverse():"+number1.modInverse(number2));
//返回值为的BigInteger 。(thisexponent mod m)
System.out.println("modPow():"+number1.modPow(BigInteger.valueOf(1), number2));
//返回值为的BigInteger (this * val)。
System.out.println("multiply():"+number1.multiply(number2));
//返回值为的BigInteger (-this)。
System.out.println("negate():"+number1.negate());
//将此BigInteger与指定的Object比较是否相等。
System.out.println("equals()就不说了,大家都明白....");
//返回一个BigInteger,其值等于该BigInteger的指定位被翻转。
System.out.println("flipBit():"+number1.flipBit(1));
//返回一个BigInteger,其值是abs(this)和的最大公约数 abs(val)。
System.out.println("gcd():"+number1.gcd(number2));
//返回此BigInteger中最右边(最低位)的一位的索引(最右边一位的右边的零位数)。
System.out.println("getLowestSetBit():"+number1.getLowestSetBit());
//返回此BigInteger的哈希码。
System.out.println("hashCode():"+number1.hashCode());
//将此BigInteger转换为int。
System.out.println("intValue():"+number1.intValue());
// 将此转换BigInteger为int,以检查是否丢失了信息。
//System.out.println("intValueExact():"+number1.intValueExact());
//true如果此BigInteger可能是质数,false则返回, 如果它绝对是复合的。
System.out.println("isProbablePrime():"+number1.isProbablePrime(10));
//将此BigInteger转换为long。
System.out.println("longValue():"+number1.longValue());
//将其转换BigInteger为long,以检查是否丢失了信息。
//System.out.println("longValueExact()"+number1.longValueExact());
//将其转换BigInteger为short,以检查是否丢失了信息。
//System.out.println("shortValueExact"+number1.shortValueExact());

//返回大于此BigInteger可能是质数的第一个整数。
System.out.println("nextProbablePrime():"+number1.nextProbablePrime());
//返回值为的BigInteger (~this)。
System.out.println("not():"+number1.not());
//返回值为的BigInteger (this | val)。
System.out.println("or():"+number1.or(number2));
//返回值为的BigInteger 。(thisexponent)
System.out.println("pow():"+number1.pow(2));
//返回带有指定bitLength的正BigInteger(可能是素数)。
System.out.println("probablePrime():"+number1.probablePrime(10, new Random(10)));



//返回一个BigInteger,其值与此指定位设置的BigInteger等效。
System.out.println("setBit():"+number1.setBit(5));

//分别返回包含整数平方根两个BigInteger的平方根 s的this和它的其余部分this - s*s。
BigInteger[] arr1=number1.sqrtAndRemainder();
System.out.println(arr1[0]+" "+arr1[1]);
//返回值为的BigInteger (this - val)。
System.out.println("subtract():"+number1.subtract(number2));
// true仅当设置了指定位时返回。
System.out.println("testBit():"+number1.testBit(1));
// 返回一个字节数组,其中包含此BigInteger的二进制补码表示形式
System.out.println("toByteArray():"+Arrays.toString(number1.toByteArray()));
//返回此BigInteger的十进制String表示形式。
System.out.println("toString()不多说了....");
//以给定的基数返回此BigInteger的String表示形式。
//返回此BigInteger在给定的基数的字符串表示形式。如果基数是从Character.MIN_RADIX到Character.MAX_RADIX包容的范围内,它会默认为10(因为Integer.toString的情况下)。注释链接:
https://www.yiibai.com/java/math/biginteger_tostring_radix.html
//说白了就是修改进制...
System.out.println("toString(int radix):"+number1.toString(10));
//返回一个BigInteger,其值等于指定的long。
System.out.println("valueOf():"+BigInteger.valueOf(8));
//返回值为的BigInteger (this ^ val)
System.out.println("xor(BigInteger val):"+number1.xor(number2));

}
}

使用例(国王游戏)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
import java.math.*;
class Node implements Comparable <Node>{
public BigInteger a,b,w;
Node(long A,long B){
a = BigInteger.valueOf(A);
b = BigInteger.valueOf(B);
w = a.multiply(b);
}
public int compareTo(Node X){
return w.compareTo(X.w);
}
}
class Main{
static int maxn = (int)1e5+10;
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
Node [] node = new Node[maxn];
int n = sc.nextInt();
for(int i = 0;i <= n;i++){
long a,b;
a = sc.nextLong();b = sc.nextLong();
node[i] = new Node(a,b);
}
Arrays.sort(node,1,n+1);
BigInteger ans = new BigInteger("-1");
BigInteger pre = node[0].a;
for(int i = 1;i <= n;i++){
ans = ans.max(pre.divide(node[i].b));
pre = pre.multiply(node[i].a);
}
System.out.println(ans);
}
}

\[ \frac{1}{2} \cdot (-4)^n + \frac{1}{4}\cdot16^n \]