import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class 最小质因子之和 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
// 是否是素数
static boolean[] isprimes = new boolean[3000001];
// 存数最小质因子
static int[] ans = new int[3000001];
public static void main(String[] args) throws Exception {
// 预处理
get(3000000);
// 前缀和
for (int i = 2; i <= 3000000; i++) {
ans[i] += ans[i - 1];
}
int t = Integer.parseInt(br.readLine());
while(t-- > 0){
int x = Integer.parseInt(br.readLine());
//输出ans[2,x]这个区间内最小的质因子之和
out.println(ans[x]);
}
out.flush();
}
static void get(int n) {
for (int i = 2; i <= n; i++) {
// 不是素数 直接跳过
if (isprimes[i]) continue;
ans[i] = i;// 记录当前最小质因子
// 找到j*i的最小质因子和合数
for (int j = 2; j <= n / i; j++) {
// 为false就是质数
if (!isprimes[j * i]) {
// 把它合数变为true
isprimes[j * i] = true;
ans[i * j] = i; // j*i这个倍数的最小质数为i
}
}
}
}
}
蓝桥杯 java 最小质因子之和
最新推荐文章于 2024-07-14 22:26:46 发布