题目标题: 连续因子 题目作者 陈越 浙江大学
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入在一行中给出一个正整数 N(1 首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 这道题目初看会觉得很难,仔细观察一下还是有思路的。首先对题目中的有关概念做以下解释。 所为连续因子序列是指,按照从小到大的次序排列的一串连续的正整数a、a+1、a+2 ... a+n-1,若他们的乘机能够整除N,则称这串数是N的一个连续因子序列,其中正整数的个数n,叫做这个连续因子序列的长度。对于一个正整数N的连续因子序列,我们需要知道一下三点事实: (1)N一定有连续因子序列。例如N本身就是一个长度为1的连续因子序列。 (2)N一定有一个最长连续因子序列。因为N是有限的,故他的连续因子序列不可能 无限长。 (3)N的最长连续因子序列可能不唯一,若N有若干的长度都是最长的连续因子序列,则这个因子序列中起始因子最小的序列,称为最小的连续因子序列。 本题就是要在N的最长因子序列中寻找最小的。 思路:对于一个给定的i,我们用里层循环找到从i开始的最长因子序列;用外层循环让i从2开始遍历到N,如果新找的到的因子序列比之前找到的长,我们用新找到的去更换当前最长续因子序列;由于我们每次找的最长因子序列的起始因子是从2开始递增的,故找到的最长因子序列一定是最小的。 注意:外循环的循环变量i是遍历起始因子的,所以i从2开始遍历。至于i到哪里结束呢?如果N是素数,则我们需要让i能取到N,但是这样会有一个测试点运行超时。如果N不是素数,我们只需要让i取到sqrt(N)即可,这样也不会超时。所以我们的处理办法是,就让i取到sqrt(N),如果没有找到最小因子序列,则说明N一定是素数,就按素数的情况输出即可。 另外,我们用来存放因子序列的数组的长度设置为12就可以了,因为13!将超过给定的正整数N的上限,也就是说对于题目给定的N,它的最长因子序列不可能超过12。 代码1: 优化:因为要记录一个连续因子,起始只需要记录它的其实因子和长度就可以了,没有必要用数组记录下整个因子序列,基于这个想法我们有如下的优化 代码2:输出格式:
因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。输入样例:
630
输出样例:
3
5*6*7
#include
#include
更多PTA题目的的参考代码,可以在wx小程序里搜“PTA刷题助手”,或扫下面的二维码