在正整數N的所有因子中,可能存在幾個連續的數字。例如,630可以分解爲3×5×6×7,其中5、6和7是三個連續的數字。現在給定任何正數N,您應該找到最大數量的連續因子,並列出連續因子的最小序列。
輸入規格:
每個輸入文件包含一個測試用例,該用例給出整數N(1 <N <2‐31)。
輸出規格:
對於每個測試用例,請在第一行中打印最大連續因子數。然後在第二行中,以格式factor [1] * factor [2] * … * factor [k]來打印連續因子的最小序列,其中因子以升序排列,不包括1 。
輸入樣例:
630
樣本輸出:
3
思路:
只用判斷根號n就可以了,大於根號n不可能是n的質因數,所以判斷到 i * i <= n 就可以了,用一個j從i開始,不斷增加,直到乘積不能被n整除(取餘爲0)就退出
代碼:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
int main()
{
long long n,anslen=0,ansfirst; //不想分析直接都是longlong
long long temp=1,j,len=0;
cin>>n;
for(long long i=2;i*i<=n;i++) //longlong最後一個測試點
{
temp=1,j=i,len=0; //質因數乘積 , j從i開始增加 , 連續質因數的長度
while(1)
{
temp*=j;
if(n%temp!=0) break; //不能整除,說明不是正確的質因數乘積
j++; //j增加
len++; //長度增加
if(len>anslen) //如果比anslen長,更新長度,更新連續質因數的頭一個數
{
anslen=len;
ansfirst=i;
}
}
}
if(anslen==0) //測試點5
{
cout<<1<<endl<<n; //一個數 就是本身
return 0;
}
cout<<anslen<<endl; //輸出長度
for(int i=ansfirst;i<ansfirst+anslen;i++) //從連續的第一個數開始,往後長度加anslen
{
cout<<i;
if(i+1<ansfirst+anslen) //不是最後一個數字,就輸出*
cout<<'*';
}
return 0;
}