题目描述
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式
输入在一行中给出一个正整数 N(1<N<231)。
输出格式
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
样例输入
630
样例输出
3
567
思路分析
- 思路就是:从2到sqrt(n)遍历,如果可以整除的话,我们就开始连续因子序列的判断, 即再另外设一个for循环开始,每当不能被n整除或者乘积已经大于n时候,就退出循环,记录其起始位置,和其最大连续子序列长度,当第一重循环遍历完,就找到了最大值
- 如果我们设最大值为-1,结束后仍然为-1,就是素数,所以不用进行素数的特判
代码
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
ll n,i,a,j;
cin>>n;
ll m=sqrt(n);
int y=-1;
int st=0;
for( i=2;i<=m;i++)
{
if(n%i!=0) continue;
a=1;
for( j=i;j<=m;j++)
{
if(n%(a*j)!=0||a*j>n) break;
a*=j;
}
if(j-i>y)
{
y=j-i;
st=i;
}
}
if(y==-1)
{
cout<<1<<endl<<n<<endl;
return 0;
}
cout<<y<<endl;
for( j=st;j<y+st-1;j++)
cout<<j<<'*';
cout<<j<<endl;
return 0;
}
另外附上素数的判定函数:
bool get_prime(int n)
{
if(n==0||n==1)
return 0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0) return 0;
}
return 1;
}