L1-006 连续因子 (20 分)一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<231)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
5*6*7
这道题要求最长且最小的连续因子序列,仔细分析不难得出,因为序列是连续的,所以我们只要知道序列的第一个数字,和序列的长度,就能得到并输出该序列
因此 此问题转化为求解 序列首数字 和 序列长度
python代码:
a=int(input())
b=int(a**0.5)
strat=0 #记录连续乘积串的首数字
len=1 # 记录连续乘积串的长度
maxlen=0
# 只需要知道 首数字 和 长度 就可以输出求出的连续乘积串 提高了算法效率
for i in range(2,b+1):
if a%i==0:
x=i
for k in range(i+1,b+2):
x=x*k
if a%x==0 and x<=a:
len+=1
else:
break
if len>maxlen: #内层for结束循环后,判断当前序列长度,如果大于最大长度,更新maxlen
maxlen=len
strat=i
len=1 #每次内层循环结束后,都要使len=1
if maxlen==0: #质数或0
print("%d\n%d"%(1,a))
else:
print("%d\n%d"%(maxlen,strat),end="")
l=1
while l<maxlen:
print("*%d"%(strat+l),end="")
l+=1
特殊测试点以及答案
最后一个测试点是大数, 不能超时,即时间复杂度至少不能大于等于o(n)