PAT A1096 Consecutive Factors (20point(s))

题目链接
注意点: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值