L1-006 连续因子(20分)[java][python]

5 阅读2分钟

题目描述

一个正整数 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 的最长连续因子序列:

  1. 由于 N < 2^31,其因子个数有限
  2. 连续因子长度不会太长,可以枚举
  3. 从 2 开始尝试每个可能的连续因子起始位置
  4. 计算连续因子的乘积,检查是否整除 N
  5. 记录最长且乘积最小的序列

关键点:连续因子长度最多为 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 的因子。