题目
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2^31 )。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
5*6*7
代码
import math #用于计算 math.sqrt(num) ,如果前 math.sqrt(num)+1 中每个数都不能如num整除,说明num为质数
num = int(input()) #输入正整数N
resultLen = 0 #最终得到的连续因子个数
resultList = [] #最终得到的因子序列
flaPrime = True #标识质数
# 枚举,start即因子序列的第一个数。从2开始,因为最长连续因子序列不包括1
for start in range( 2, int( math.sqrt(num) )+1 ):
factor = start #给因子1赋值为因子序列的第一个值
tempNum = num #保存单次相除之后的临时结果
tempList = [] #保存以start为开头的因子序列内容
# 判断目前因子与临时结果相除是否能够整除
while tempNum % factor == 0:
tempList.append(str(factor)) #将能除的因子添加到临时保存此次连续因子序列的列表中,添加str()函数,将结果从int类型转化为str类型,是方便最后输出时,与符号'*'相结合
tempNum = tempNum // factor #将整除之后的结果保存到临时结果中
factor += 1 #保证之后的因子是连续的,做加一操作之后,继续相除
flaPrime = False #表示num是否为质数,已进入此while循环,说明,num一定不是质数
tempLen = factor-start #计算以start开头的连续因子序列的长度
# 如果临时的连续因子序列比之前的长,则进入循环,更新结果连续因子序列
# 而且不能等于,因为要求最小的连续因子序列,start是按照从小到大的循序进行枚举的,所以隐含满足这个条件。
if tempLen > resultLen :
resultLen = tempLen #更新结果连续因子序列长度
resultList = tempList #更新结果连续因子序列内容
# 如果num不为质数,则输出个数和结果。
# 如果是质数,则num只有 num = 1*num。规定1不算在内,所以,最长连续因子序列只能为num本身,且个数为1
if flaPrime == False :
print(resultLen)
print("*".join(resultList))
else:
print(1)
print(num)