输入格式:
输入在一行中给出一个正整数N(1<N<231)。
输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
输入样例:630输出样例:
35*6*7
本题使用暴力,把所有的因子都存下来然后从前往后找连续的因子保存最长因子序列的长度和开始位置(注意最长因子之乘积也是n的因子,如1260的因子有 2 3 4 5 6 7 10. . . . .最长的连续因子序列长度应该是6即2 3 4 5 6 7但是 1260%(2*3*4*5*6*7)!=0,所以2 3 4 5 6 7不是1260的最长连续因子序列)
代码
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[1000];//存n的所有因子
scanf("%d",&n);
int m;
m=sqrt(n);//使用平方根进行因子查询,防止时间超限
int i,j,t=0;
for(i=2;i<=m;i++)
{
if(n%i==0)//找因子
{
a[t]=i;
t++;
}
}
if(t==0)//这个数是素数
{
printf("1\n%d",n);
}
else
{
m=0;//m存起始位置
int le=0,s;//le存长度,s表示因子之积
for(i=0;i<t;i++)
{
s=1;
for(j=i;j<t;j++)
{
if(j==i)//判断是不是连续因子的首位
s=s*a[j];
else
{
if(a[j]-a[j-1]!=1)//判断是否连续
{
break;
}
s=s*a[j];
}
if(n%s!=0)//判断是否是n的连续因子
break;
}
if(j-i>le)
{
m=i;
le=j-i;
}
}
printf("%d\n",le);
printf("%d",a[m]);
for(i=m+1;i<le+m;i++)//输出格式控制
{
printf("*%d",a[i]);
}
}
return 0;
}