题目描述
一个正整数 N 的因子是能够整除 N 的正整数。连续因子指的是若干个连续的正整数,它们都恰好是 N 的因子。
例如,对于 360,其连续因子可以是 3×4×5=60,因为 3、4、5 都是 360 的因子。
给定一个正整数 N,请找出 N 最大的连续因子序列,输出最长的连续因子个数,以及最小的连续因子序列。
输入输出格式
输入:一个正整数 N(1 < N < 2^31)
输出:
- 第一行:最长连续因子个数
- 第二行:最小的连续因子序列(如果有多个,输出乘积最小的那个)
样例
输入
630
输出
3
3*4*5
解题思路
本题需要找出正整数 N 的最长连续因子序列:
- 由于 N < 2^31,其因子个数有限
- 连续因子长度不会太长,可以枚举
- 从 2 开始尝试每个可能的连续因子起始位置
- 计算连续因子的乘积,检查是否整除 N
- 记录最长且乘积最小的序列
关键点:连续因子长度最多为 12 左右(因为 13! > 2^31)
代码实现
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
long start = 0;
int maxLen = 0;
for (long i = 2; i <= Math.sqrt(n); i++) {
long num = n;
long j = i;
while (num % j == 0) {
num /= j;
j++;
}
int len = (int) (j - i);
if (len > maxLen) {
maxLen = len;
start = i;
}
}
if (maxLen == 0) {
System.out.println(1);
System.out.println(n);
} else {
System.out.println(maxLen);
for (int i = 0; i < maxLen; i++) {
if (i > 0) System.out.print("*");
System.out.print(start + i);
}
}
}
}
Python
import math
n = int(input())
start = 0
max_len = 0
for i in range(2, int(math.sqrt(n)) + 1):
num = n
j = i
while num % j == 0:
num //= j
j += 1
length = j - i
if length > max_len:
max_len = length
start = i
if max_len == 0:
print(1)
print(n)
else:
print(max_len)
print('*'.join(str(start + i) for i in range(max_len)))
运行验证
Java
输入: 630
输出:
3
3*4*5
Python
输入: 630
输出:
3
3*4*5
复杂度分析
- 时间复杂度:O(√N × k),k 为连续因子长度
- 空间复杂度:O(1)
总结
本题考察枚举和数学思维。通过观察发现连续因子长度有限,可以枚举起点并逐个检查。关键在于理解"连续因子"的定义,以及如何判断一个连续序列是否是 N 的因子。