题目描述
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<231 )。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
567
来源
团体程序设计天梯赛-练习集
解题思路
- 题目要找的是n的最长连续因子序列。若有多个最长,那么找到最小的。
- 依次令i=2, 3, 4, …, n \sqrt{n} n,求出以数字i开头的连续因子序列的长度num(num可能等于0)。同时,选出其中最大的num(等长的话,最小的)和对应的i,根据选出来的num和i,得出最长的连续因子序列。
- 什么是数字i开头的连续因子序列?以题目描述给出的输出样例为例,567是数字5开头的连续因子序列,序列长度是3。111213*14是数字11开头的连续因子序列,长度为4。
- 已知i的值,如何找出数字i开头的连续因子序列?答案如下:
(1)令nn=n, yinzi = i
(2)while nn % yinzi == 0:
nn = nn / yinzi
yinzi += 1
(3)令start = i, num = yinzi - i,这里start就是序列开头的数字i,num就是连续因子序列的长度。
参考答案
import math
n = int(input())
longest_start = n #最长的连续因子序列的开头数字
longest_num = 1 #最长连续因子序列的长度
n_sqrt = int(math.sqrt(n)) #如果在2..n的平方根之间找不到n的因子,那么n是质数
for i in range(2, n_sqrt + 1): #以i开头的连续因子序列有多长?
yinzi = i
nn = n
while nn % yinzi == 0:
nn = nn // yinzi
yinzi += 1
start = i
num = yinzi - i #以start开头的连续因子序列的长度
if num > longest_num or (num == longest_num and longest_start > start):
longest_start = start #以start开头的连续因子序列是目前最长的
longest_num = num
longest_list = [str(longest_start + i) for i in range(longest_num)] #最长连续因子序列
print(longest_num)
print("*".join(longest_list))
测试用例
- 题目描述给出的测试用例覆盖了连续因子序列长度大于1的情形。
- 再找一个长度大于1的情形。11121314=24024。
样例输入
24024
样例输出
4
11121314 - 连续因子序列的长度等于1,但小于n的情形。
样例输入
9
样例输出
1
3 - n是质数的情形,连续因子序列的长度等于1,就是n。
样例输入
997
样例输出
1
997 - 有多个等长的连续因子序列。需要确认找到的是最小的。
样例输入
358800
样例输出
4
234*5
小结
- 本题采用的算法是穷举法——穷举以数字2,3, …, n \sqrt{n} n开头的连续因子序列,选出其中最长的。