一、题目概述
求某整数的最大连续因数序列。
二、思路
构造一个数值区间,len为区间长度, num为区间内数值的积,不断尝试区间内数值的积是否为因数。num为因数时,增加尝试的区间长度。
难点:测试点6用例为一个大素数,i从2到N迭代会出现测试点超时。
此时考虑分为N是素数与非素数两种情况:
1、N非素数,则至少存在两个因数,若两个因数连续,则最大可能为根号N的上下界(设根号N不为整数,若为整数则为根号N)
2、N为素数,则唯一因数为N。
因此i迭代上界确定为sqrt(N)的上界,解决超时问题。
注:上界函数double ceil(double),调用库< cmath >(<math.h>)。
三、代码
#include <cstdio>
#include <cmath>
int main()
{
int N, ans, len = 0;
scanf("%d", &N);
for( int i = 2, pdt = 1; i <= sqrt((double)N) + 1; pdt /= i++ )
{
pdt *= i + len;
while( N % pdt == 0 )
{
++len;
ans = i;
pdt *= i + len;
}
}
if( len )
{
printf("%d\n", len);
for( int i = 0; i < len; ++i )
printf("%s%d", i ? "*":"", ans + i);
}
else printf("1\n%d", N);
}