一、最小乘积代价和

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
if (n == 1) {
System.out.println(0);
continue;
}
long sum = 0;
int x = n;
for (int i = 2; i * i <= x; i++) {
while (x % i == 0) {
sum += i;
x /= i;
}
}
if (x > 1) {
sum += x;
}
System.out.println(sum);
}
}
}
运行结果

二、小苯的数字权值

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static final int MAX = 200000;
static int[] omega = new int[MAX + 1];
static int[] primes = new int[MAX + 1];
static boolean[] isPrime = new boolean[MAX + 1];
static int cnt = 0;
static void sieve() {
// 初始化
for (int i = 2; i <= MAX; i++) {
isPrime[i] = true;
}
for (int i = 2; i <= MAX; i++) {
if (isPrime[i]) {
primes[cnt++] = i;
omega[i] = 1;
}
for (int j = 0; j < cnt && primes[j] * i <= MAX; j++) {
int p = primes[j];
isPrime[i * p] = false;
omega[i * p] = omega[i] + 1;
if (i % p == 0) {
break;
}
}
}
}
public static void main(String[] args) {
sieve();
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while (T-- > 0) {
int x = in.nextInt();
System.out.println(omega[x] * 2);
}
}
}
运行结果

三、筛法判断质数

import java.util.Scanner;
public class Main {
static final int MAX = 1000000;
static boolean[] isPrime = new boolean[MAX + 1];
static int[] primes = new int[MAX + 1];
static int cnt = 0;
static void sieve() {
for (int i = 2; i <= MAX; i++) {
isPrime[i] = true;
}
for (int i = 2; i <= MAX; i++) {
if (isPrime[i]) {
primes[cnt++] = i;
}
for (int j = 0; j < cnt && primes[j] * i <= MAX; j++) {
isPrime[i * primes[j]] = false;
if (i % primes[j] == 0) break;
}
}
}
public static void main(String[] args) {
sieve();
Scanner in = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int T = in.nextInt();
while (T-- > 0) {
int n = in.nextInt();
if (isPrime[n]) {
sb.append("Yes\n");
} else {
sb.append("No\n");
}
}
System.out.print(sb);
}
}
运行结果

四、质数统计

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static final int MAX = 1000000;
static boolean[] isPrime = new boolean[MAX + 1];
static int[] pre = new int[MAX + 1]; // 前缀和,pre[i] = 1~i质数个数
static int[] primes = new int[MAX + 1];
static int cnt = 0;
static void sieve() {
for (int i = 2; i <= MAX; i++) {
isPrime[i] = true;
}
for (int i = 2; i <= MAX; i++) {
if (isPrime[i]) {
primes[cnt++] = i;
}
for (int j = 0; j < cnt && primes[j] * i <= MAX; j++) {
isPrime[i * primes[j]] = false;
if (i % primes[j] == 0) break;
}
}
// 构造前缀和
pre[0] = pre[1] = 0;
for (int i = 2; i <= MAX; i++) {
pre[i] = pre[i - 1] + (isPrime[i] ? 1 : 0);
}
}
public static void main(String[] args) {
sieve();
Scanner in = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int n = in.nextInt();
while (n-- > 0) {
int l = in.nextInt();
int r = in.nextInt();
int ans = pre[r] - pre[l - 1];
sb.append(ans).append('\n');
}
System.out.print(sb);
}
}
运行结果

五、素数对

import java.util.Scanner;
public class Main {
static final int MAX = 500000;
static boolean[] isPrime = new boolean[MAX + 1];
static int[] primes = new int[MAX + 1];
static int cnt = 0;
static void sieve() {
for (int i = 2; i <= MAX; i++) {
isPrime[i] = true;
}
for (int i = 2; i <= MAX; i++) {
if (isPrime[i]) {
primes[cnt++] = i;
}
for (int j = 0; j < cnt && primes[j] * i <= MAX; j++) {
isPrime[i * primes[j]] = false;
if (i % primes[j] == 0) break;
}
}
}
public static void main(String[] args) {
sieve();
Scanner in = new Scanner(System.in);
int N = in.nextInt();
long ans = 0;
for (int i = 0; i < cnt; i++) {
int C = primes[i];
if (C > N) break;
long S = (long) C * C;
if (S > 2L * N) break;
int L = (int) Math.max(2, S - N);
int R = N;
for (int A = L; A <= R; A++) {
if (!isPrime[A]) continue;
long B = S - A;
if (B < 2 || B > N) continue;
if (isPrime[(int) B]) {
ans++;
}
}
}
System.out.println(ans);
}
}
运行结果

本文聚焦数论进阶中的关键算法实践,涵盖最小乘积代价和优化、数字权值计算、埃氏筛法/线性筛法判断质数、区间内质数统计及素数对构造等典型问题,强调算法原理与高效实现,适用于算法竞赛与系统性能优化场景。
167

被折叠的 条评论
为什么被折叠?



