1. 程式人生 > 實用技巧 >L1-006 連續因子

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,來找滿足題目要求的序列。