一个正整数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
思路:暴力求解。最大数在12的阶乘与13的阶乘之间,所以最长可能长度为12。长度从12开始试,一直试到1。每个长度中最小值从2到sqrt(n) (其实到n^(1/长度)-长度 就可以了) 遍历,如果序列乘积能被整除,则找到答案。
如果长度为1仍没有答案,说明n是质数,答案输出1和n本身。
#include<iostream>
#include<cmath>
using namespace std;
bool judge(int lgh, int start, int n)
{
int rst=1;
for(int i=start;i<start+lgh;i++)
{
rst*=i;
}
if(n%rst==0)return true;
else return false;
}
int main()
{
int n;
cin>>n;
int store[4];
int flag=0;
for(int mlg=12;mlg>=1;mlg--)
{
for(int start=2;start<=sqrt(n);start++)
{
if(judge(mlg,start,n))
{
store[0]=mlg;
store[1]=start;
flag=1;
break;
}
}
if(flag)break;
}
if(flag)
{
cout<<store[0]<<endl;
cout<<store[1];
for(int i=store[1]+1;i<store[1]+store[0];i++)
cout<<'*'<<i;
}
else
cout<<1<<endl<<n;
}