PAT A1096 Consecutive Factors


思路分析:如果输入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("*");
        }
    }
}
原文地址:https://www.cnblogs.com/shuibeng/p/13562739.html