在正整数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;
}