一个正整数 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
代码实现1:
#include<stdio.h>
#include<math.h>
int isPrime(int n)
{
int i;
for (i=2;i<=sqrt(n)+1;i++)//重点:sqrt(n)+1
{
if (n%i==0)
return 0;
}
return 1;
}
int main()
{
int i,n,s,maxs=0,maxl=0,j;
scanf("%d",&n);
if (isPrime(n))
{
printf("1\n");
printf("%d\n",n);
return 0;
}//若为素数则不符合题意
for(i=2;i<=sqrt(n)+1;i++)
{
if(n%i==0)
{
s=i;
for(j=i+1;j<=sqrt(n)+1;j++)
{
s*=j;
if(n%s!=0)
break;
}//判断因子是否连续 ,若不连续则寻找下一个
if(maxs<j-i)//判断j-i>0,说明有连续
{
maxs=j-i;//给maxs赋值,继续循环找出最长的
maxl=i;
}
}
}
printf("%d\n",maxs);
for(i=maxl;i<=maxs+maxl-1;i++)
{
if(i!=maxl)
printf("*");
printf("%d",i);
}
return 0;
}
代码实现2(通过部分测试点):
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d", &n);
int arr[50];
int i = 0, j = 0;
int N = sqrt(n);
int a = 0, b = 0;//连续因子数
int max;
for (i = 2; i <= N; i++)
{
if (n % i == 0)
{
arr[j] = i;
if (arr[j] == arr[j - 1] + 1 && j > 0 || j == 0)
{
b++;
}
if (arr[j] != arr[j - 1] + 1 && j > 0)
{
if (a <= j-1)
{
a = b;
max = arr[a - 1];
}
arr[0] = i;
j = 0;
b = 1;
}
j++;
}
if (i == N && a == 0)
{
a = b;
max = arr[a-1];
}
}
printf("%d\n", a);
for (i = a - 1; i >= 0; i--)
{
int m = max - i;
printf("%d", m);
if (i != 0)
printf("*");
}
return 0;
}