L1-006 連續因子
阿新 • • 發佈:2020-11-04
一個正整數 N 的因子中可能存在若干連續的數字。例如 630 可以分解為 3×5×6×7,其中 5、6、7 就是 3 個連續的數字。給定任一正整數 N,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。
輸入格式:
輸入在一行中給出一個正整數 N(1<N<231)。
輸出格式:
首先在第 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,來找滿足題目要求的序列。