一开始我是每一个因数都要算一下,这样最后一个测试点会超时。
那么寻找更优的方法,我一开始很朴素地认为直接把n/2就好了,但还是会超时。
但其实两个数相乘不超过n的最小数应该是 (根号n)+1。
然后既然用了这种方法,这样的话最后一个数本身是不会被检测的,那么就要求先把maxid置为0,如果经过循环后值还是0,那么他最大长度就是1,因数就是他本身了。
第二次写的时候绕进去了,一直在想把这样的一个序列完整找出来,例如630=3×5×6×7,但仔细思考其实是不需要的,直接去寻找连乘后能被整除的数,直到他不能被整除后就退出循环,因为如果5×6×7能被630整除,那么剩下的一个因子一定是也能被整除的(这个因子可不可以继续分解是不需要考虑的,我们只需要考虑当前序列是连续的就可以)。那么按照这个思路,问题就转化成了对于给定数n,可以最多由几个连续整数整除的问题,按照这个思路写就很清晰了。
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n;
cin>>n;
int maxlen=0;
int maxid=0;
int testlen=sqrt(1.0*n);
for(int i=2;i<=testlen+1;i++){
if(n%i==0){
int nowlen=0;
int temp=n;
int tempid=i;
while(temp%tempid==0){
nowlen++;
temp/=tempid;
tempid++;
}
if(nowlen>maxlen){
maxlen=nowlen;
maxid=i;
}
}
}
if(maxid==0){
printf("1\n%d",n);
}else{
printf("%d\n",maxlen);
for(int i=0;i<maxlen;i++){
printf("%d",maxid);
maxid++;
if(i!=maxlen-1){
printf("*");
}
}
}
return 0;
}