A1096.Consecutive Factors

//题意:求一个数的最大的连续因数个数,例如: 8064 = 2*3*4*6*7*8
//- 最大的连续因子个数为3个:{2,3,4},{6,7,8}。
//- 如果存在相同个数的连续子序列,输出较小的那个。 

//思路分析:如果输入n为素数,那么因数只可能为自己,因为题目说了不包括1。故第一行输出1,第二行输出n。 
//如果一个数为合数,则该数的因数的最大上限为sqrt(n)。
//使用一个二重循环,外层循环枚举i从2到sqrt(n)表示枚举第一个因数。内层循环枚举j从i到sqrt(n)表示所有连续的因数 
//temp为当前所有因数乘积(因数不相同),temp *= j。当(n%temp != 0)时则退出循环,然后看当前
//因子个数j-i是否比Max要大,大则更新当前Max,并将first设置为i。
//第一行输出Max,并从第二行first开始输出Max个连续数字。 
#include <bits/stdc++.h>
using namespace std;

bool isprime(int n) {
    if(n <= 0 || n == 1) return false;
    int sqrn = sqrt(n);
    for(int i = 2;i <= sqrn;i++) 
        if(n % i == 0) return false;
    return true;    
}

int main(void){
    int n;cin>>n;
    if(isprime(n))      //如果是素数直接输出1和n 
        cout<<1<<endl<<n;
    else {
        int first = 0,maxn = sqrt(n);   
        int Max = 0;            //最大的连续因子长度 
        for(int i = 2;i <= maxn;i++) {          //遍历第一个可能的因数 
                int j,temp = 1;
            for(j = i;j <= maxn;j++) {  //遍历所有可能连续的因数 
                temp *= j;
                if(n % temp != 0) break;         //如果当前的数不是因数 
            }
            if(j - i > Max) {
                Max = j - i;
                first = i;
            }
        }
        cout<<Max<<endl;
        for(int i = 0;i < Max;i++) {
            if(i > 0) cout<<"*";
            cout<<first + i;
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/Western-Trail/p/10356301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值