import java.util.Scanner;
public class Main {
static int index = 0;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//特判
if(n == 1){
System.out.println(2);
}else{
int[] su = new int[100001]; //素数表
int[] sus = new int[100001]; //在唯一分解定理中出现的素数
int[] ci = new int[100001]; //各个素数的指数
int ind = 0;
int ans = 1;
int sum = 0;
sushu(su,n);
int c = n;
boolean flag = false;
//利用唯一分解定理
for(int i = 0;i<index;i++){
if(c == 1){
break;
}
while (c % su[i] == 0){
c /= su[i];
sus[ind] = su[i];
ci[ind]++;
flag = true;
}
if(flag){
ind++;
}
flag = false;
}
//如果n只有一种因子,例如5,那么最优解为5+1=6
if(ind == 1){
System.out.println(n+1);
}else{
for(int i = 0;i<ind;i++){
while(ci[i] > 0){
ans *= sus[i];
ci[i]--;
}
sum += ans;
ans = 1;
}
System.out.println(sum);
}
}
}
//利用Eratosthenes算法构造素数表
public static void sushu(int[] su,int n) {
boolean[] vis = new boolean[n + 1];
int m = (int) Math.sqrt(n + 0.5);
for (int i = 2; i <= m; i++) {
if (vis[i] == false) {
for (int j = i * i; j <= n; j += i) {
vis[j] = true;
}
}
}
for(int i = 2;i<=n;i++){
if(vis[i] == false){
su[index++] = i;
}
}
}
}
最小公倍数的最小和 Java
最新推荐文章于 2025-12-02 21:20:38 发布
该博客主要讨论了一个Java程序,该程序利用Eratosthenes筛法构造素数表,并基于唯一分解定理解决特定的数学问题。程序首先判断输入的整数是否为1,然后通过素数表分解输入的数,计算其因子及其指数。如果输入的数只有一个因子,输出其加1的结果;否则,根据因子和指数计算总和并输出。此算法展示了如何在编程中应用数论概念。
316

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



