https://pintia.cn/problem-sets/994805046380707840/problems/994805138600869888
解析
求一个整数 N 的最长连续因子,且它是最小的,不包含 1。
那么我们从 2 开始逐个去与 N 取模,判断 j 是否为 N 的因子,注意这个过程是连续的,若期间 N % j ≠ 0 N \% j \neq 0 N%j=0 ,则就终止,期间要记录和更新连续的长度 temp,还需要注意因子连续的乘积也必须为 N 的因子。
若真的从 2 开始逐个求因子,那么必然会 TLE,因此到 s q r t ( N ) sqrt(N) sqrt(N) 结束即可,(别问我为什么,我也不知道)。
而判断因子,我们只需要判断到 s q r t ( N ) sqrt(N) sqrt(N) 即可(这个不用我说,都知道)。
AC Code
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
public static void main(String[] args) throws Exception {
int n = nextInt();
int sqrt = (int) Math.sqrt(n);
int start = 0, len = 0;
for(int i = 2; i <= sqrt; i++) { // 以 i 打头
int temp = 0; // 连续因子的长度
int cur = 1; // 连续因子的乘积
for(int j = i; j <= n / i; j++) { // 判断因子
if(n % j == 1) break; // 不是因子,直接退出
if(n % (cur * j) == 0) { // 乘积也需要为 N 的因子
temp++;
cur *= j;
} else break;
}
if(temp > len) { // 只要长度最长的因子
start = i; // 记录起始位置
len = temp; // 更新长度
}
}
if(start == 0) { // 是质数
System.out.println(1);
System.out.println(n);
return;
}
System.out.println(len);
for(int i = start; i < start + len; i++) {
if(i != start + len - 1) System.out.print(i + "*");
else System.out.print(i);
}
}
public static int nextInt() throws Exception {
st.nextToken();
return (int) st.nval;
}
}