一个正整数 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
/*
求的最小的连续因子序列是所有最长连续因子序列中的第一个,
好比最长的连续因子序列长度为3, 求出第一个长度为3的连续因子序列,
可能后面还有长度为3的连续因子序列,但 start 不会更新
*/
include<stdio.h>
#include<stdbool.h>
#include<math.h>
bool is_prime(int x)
{
int i;
for( i = 2 ; i<=sqrt(x) ; i++)
{
if(x%i==0) return false;
}
return true;
}
int main()
{
long long n;
scanf("%lld",&n);
long long i, j;
long long mul = 1;
int start = 0, len = 0;
if(is_prime(n)) printf("1\n%d",n); //先判断是否素数
else
{
for( i =2 ; i<=sqrt(n) ; i++)
{
mul = 1;
for( j = i; mul*j<=n ; j++)
{
mul*=j;
if(n%mul==0&&j-i+1>len) //如果j-i+1>len则更新len,如果找出第一个的最长的连续因子序列
{ //len就不会更新
start = i;
len = j-i+1;
}
}
}
printf("%d\n",len);
for( i = start ; i<start+len ; i++)
{
if(i==start) printf("%lld",i);
else printf("*%lld",i);
}
}
return 0;
}
详细解释CSDN博主Piink blog.csdn.net/Piink/artic…