Python入门习题(50)——团体程序设计天梯赛习题:连续因子

题目描述

时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:
输入在一行中给出一个正整数 N(1<N<2​31​​ )。

输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:
630

输出样例:
3
567

来源
团体程序设计天梯赛-练习集

解题思路

  1. 题目要找的是n的最长连续因子序列。若有多个最长,那么找到最小的。
  2. 依次令i=2, 3, 4, …, n \sqrt{n} n ,求出以数字i开头的连续因子序列的长度num(num可能等于0)。同时,选出其中最大的num(等长的话,最小的)和对应的i,根据选出来的num和i,得出最长的连续因子序列。
  3. 什么是数字i开头的连续因子序列?以题目描述给出的输出样例为例,567是数字5开头的连续因子序列,序列长度是3。111213*14是数字11开头的连续因子序列,长度为4。
  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的情形。
  2. 再找一个长度大于1的情形。11121314=24024。
    样例输入
    24024
    样例输出
    4
    11
    121314
  3. 连续因子序列的长度等于1,但小于n的情形。
    样例输入
    9
    样例输出
    1
    3
  4. n是质数的情形,连续因子序列的长度等于1,就是n。
    样例输入
    997
    样例输出
    1
    997
  5. 有多个等长的连续因子序列。需要确认找到的是最小的。
    样例输入
    358800
    样例输出
    4
    234*5

小结

  1. 本题采用的算法是穷举法——穷举以数字2,3, …, n \sqrt{n} n 开头的连续因子序列,选出其中最长的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值