1096 Consecutive Factors (20分)

Among all the factors of a positive integer N, there may exist several consecutive numbers. For example, 630 can be factored as 3×5×6×7, where 5, 6, and 7 are the three consecutive numbers. Now given any positive N, you are supposed to find the maximum number of consecutive factors, and list the smallest sequence of the consecutive factors.

Input Specification:
Each input file contains one test case, which gives the integer N (1<N<2
​31
​​ ).

Output Specification:
For each test case, print in the first line the maximum number of consecutive factors. Then in the second line, print the smallest sequence of the consecutive factors in the format factor[1]factor[2]…*factor[k], where the factors are listed in increasing order, and 1 is NOT included.

Sample Input:
630
Sample Output:
3
5*6*7

就是一道求因式分解的最大连续子序列的。
因为n不能由sqrt(n)和比他大的数相乘得到,所以从2遍历到sqrt(n)即可,sqrt也要取。其实就是暴力,j=i,直到n%j不等于0为止,期间n/=j,且j++循环退出后,判断j-i和maxn哪个大,如果大于,就更新最大长度和最长子序列的起点=i
遍历完后,如果maxn还是为0,证明只能找到为本身的因子,所以输出1和本身
反之输出最大长度,且从起点遍历到起点+长度,输出

这道题给你一个例子就可以理解,输入9,输出1 和 3
输入5,输出5

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main(){
    ll n;
    cin>>n;
    int Sqrt = int(sqrt(n));
    int maxn = 0, u = 0;
    for(int i = 2; i <= Sqrt; i++){
        int j = i;
        int sum = n;
        while(sum%j==0){
            sum /= j;
            j++;
        }
        if(j-i > maxn) {
            maxn = j - i;
            u = i;
        }
    }
    if(maxn == 0) cout<<"1"<<endl<<n;
    else{
        cout<<maxn<<endl;
        for(int i = u; i <u + maxn;i++){
            if(i!=u) cout<<"*";
            cout<<i;
        }
    }
    return 0;
}

从2开始遍历到sqrt即可,如果sum%j不为0了,证明连续因子断了,就判断这串连续因子的长度和最大长度哪个长,长久更新,记得记录起始位置(用vector更新也行)
如果最长序列为0,证明这个数为素数,那么因子就是本身,输出本身即可

#include<cmath>
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int n;
    cin>>n;
    int Sqrt = (int) sqrt(n);
    int maxCnt = 0;
    int u;//序列的初始值
    for(int i =2; i <= Sqrt; i++){
        int sum = n;
        int j = i;
        while(sum%j ==0){
            sum /= j;
            j++;
        }
        if(j-i > maxCnt){
            maxCnt = j -i;
            u = i;
        }
    }
    if(maxCnt == 0) cout<<"1"<<endl<<n;
    else{
        cout<<maxCnt<<endl;
        for(int i = u; i < u +maxCnt; i++){
            if(i!=u) cout<<"*";
            cout<<i;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值