思路分析:如果输入n为素数,那么因数只可能为自己,因为题目说了不包括1。故第一行输出1,第二行输出n。
如果一个数为合数,则该数的因数的最大上限为sqrt(n)。
使用一个二重循环,外层循环枚举i从2到sqrt(n)表示枚举第一个因数。内层循环枚举j从i到sqrt(n)表示所有连续的因数
temp为当前所有因数乘积(因数不相同),temp *= j。当(n%temp != 0)时或者n>temp时退出循环,然后看当前因子个数templen是否比mlen要大,大则更新当前mlen,并将right设置为i。
教训:写判断条件要写完整不要刻意减少步骤,看似简略但可读性降低,得不偿失。
#include<cstdio>
#include<math.h>
int main(){
long long n;
scanf("%lld",&n);
int templen = 0;
int mlen = 0;
long long temp = 0;//记录中间值
long long half = (long long)sqrt(n);
long long right;
for(long long i = 2;i <=half;i++){
if(n%i==0){//找到整除第一个数,开始尝试后面的数字
temp = i;
templen = 1;
if(mlen==0){
mlen = 1;
right = i;
}
for(long long j = i+1;j <=half;j++){//从第二个数开始尝试
temp = temp*j;
if(temp > n){//越界,失败
break;
}else if(n%temp==0){
templen++;
if(templen > mlen){
mlen = templen;
right = j;
}
}else{//这个数字不行,失败
break;
}
}
}else{
continue;
}
}
//print
if(mlen == 0) {
printf("1
");
printf("%lld",n);
}else{
printf("%d
",mlen);
for(int i = 1;i <= mlen;i++){
printf("%lld",right-mlen +i);
if(i<=mlen-1) printf("*");
}
}
}