题目链接
注意点:1.N不会被除自己以外的大于根号N的整数整除,因此只需要从2~根号n遍历连续因子的第一个,上限设为根号N可以降低时间复杂度,否则最后一个样例会超时。
2.遍历结束后连续因子长度还为0,说明连续因子只有本身,需特判。
#include<cstdio>
#include<math.h>
int main(){
int n,anslen=0,ansi=0;
//ans是最大连续长度,ansi是连续因子的第一个
scanf("%d",&n);
int sqr=(int)sqrt(1.0*n);
//判断因子的上界需设置为根号n,不然就超时
for(int i=2;i<=sqr;i++){//遍历连续的第一个整数
int temp=i,j=i,len=0;//temp是当前连续整数的乘积
while(n%temp==0){//能整除
len++;//连续长度加1
if(len>anslen){//发现更大的长度
anslen=len;//更新最大长度和连续因子的第一个整数
ansi=i;
}
j++;
temp*=j;//看是否还存在更长的连续因子序列
}
}
if(anslen==0) {//如果anslen=0,要特判
printf("1\n%d",n);
}
else{//否则输出正常结果
printf("%d\n",anslen);
for(int i=ansi;i<ansi+anslen;i++){
printf("%d",i);
if(i!=(ansi+anslen-1)) printf("*");
}
}
return 0;
}