L1-006 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2​31​​)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

说明:
 暴力求解法:这道题目的目的是找到一个数的最长连续因子,可以按照求质因数的方法,对该数字求根号后的值进行遍历,并且使用一个值来记录连续数字的初始值与连续数字的长度,最后输出最长的连续数字串。
 另外,需要注意的是,当所求的数是质数时,该数字的判断会被sqrt(n),给派出,所以,需要在最后加上质数的判断结果。
代码:

#include<iostream>
#include<cmath>

using namespace std;

int main(){
    int N,temp;
    int count = 0, maxcount = 0, start = 0;
    cin>>N;
    for(int i = 0; i <=sqrt(N); i++){
        temp = N;
        count = 0;
        int j = i;
        while(temp%j == 0){
            temp/=j++;
            count ++;
        }
        if(count > maxcount){
            maxcount = count;
            start = i;
        }
    }
    if(maxcount){
        cout<<maxcount<<endl;
        for(int i = 0; i < maxcount; i++){
            count << start + i;
            if(i != maxcount - 1)
                cout<<"*";
        }
    }
    else
        cout<<"1"<<endl<<N;
    return 0;
}

 另附柳大神的思路:使用暴力破解发,一个个尝试,既然是递增连续的因子长度,那么必定是几个不重复的连续数字,按照阶乘的思路,由题目已知n最大是231,这个值介于12与13的阶乘之间,所以,所求的连续因子的最大长度是12,所以,可以从len = 12开始,一直到 len = 1,来找满足题目要求的序列。

posted @ 2020-11-04 16:49  Frances_FKYM  阅读(243)  评论(0)    收藏  举报