警告
本文最后更新于 2022-09-07,文中内容可能已过时。
1
2
3
4
5
6
7
| static boolean isPrime(int n) {
if (n < 2) return false;
// i * i <= n 可能溢出
for (int i = 2; i <= n / i; i++)
if (n % i == 0) return false;
return true;
}
|
1
2
3
4
5
6
7
8
9
10
11
| // isNotPrime[i] 表示 i 是否不是质数
static boolean[] isNotPrime = new boolean[10000];
static void getPrime(int n) {
// 判断 [1, n] 中每个数是否是质数
for (int i = 2; i <= n; i++) {
if (isNotPrime[i]) continue;
for (int j = i; j <= n / i; j++)
isNotPrime[i * j] = true;
}
}
|
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
| static List<List<Integer>> decomposition(int n) {
// 质因数从小到大排序
// factors[i][0] 表示第 i 个质因数
// factors[i][1] 表示第 i 个质因数的数量
List<List<Integer>> factors = new ArrayList<>();
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) { // 质因数
List<Integer> factor = new ArrayList<>();
factor.add(i);
int cnt = 0;
while (n % i == 0) { // 计算质因数数量
cnt++;
n /= i;
}
factor.add(cnt);
factors.add(factor);
}
}
if (n > 1) { // 最后剩下的质因数
List<Integer> factor = new ArrayList<>();
factor.add(n);
factor.add(1);
factors.add(factor);
}
return factors;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| // 质因数从小到大排序
// factors[i][0] 表示第 i 个质因数
// factors[i][1] 表示第 i 个质因数的数量
int factors[100][2];
int n_factor = 0; // 不同质因数的数量
void decomposition(int n) {
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
factors[n_factor][0] = i;
while (n % i == 0) {
factors[n_factor][1]++;
n /= i;
}
n_factor++;
}
}
if (n > 1) {
factors[n_factor][0] = n;
factors[n_factor++][1] = 1;
}
}
|
Greatest Common Divisor
Least Common Multiple
1
2
3
4
5
6
7
| static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
| static double sqrt(double x) {
if (x < 0) return Double.NaN;
double threshold = 1e-15;
double left = 0.0;
double right = x;
while (true) {
double mid = (left + right) / 2;
if (Math.abs(mid * mid - x) < threshold) return mid;
else if (mid * mid > x) right = mid;
else left = mid;
}
}
|
- 对于函数 $y=\sqrt{x}$,计算 $y_0=\sqrt{x_0}$。
$$
y = \sqrt{x} \newline
y’ = \frac{1}{2\sqrt{x}}
$$
1
2
3
4
5
6
7
8
| static double sqrt(double x) {
if (x < 0) return Double.NaN;
double threshold = 1e-15;
double x1 = x;
while (Math.abs(x1 - x / x1) > threshold * x1)
x1 = (x / x1 + x1) / 2;
return x1;
}
|