题目描述
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2^31 )。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
5*6*7
心得
本题主要是提出了一种想法
与题目一一对应
最长连续因子的个数——length从长(12)到短(1)
最小的连续因子序列——第一个数从小(2)到大( sqrt(N))
代码实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
int len=0, j=0, start = 2, flag = 0;
long long mul = 1, N = 0;
scanf("%lld", &N);
int sqn = sqrt(N);//N平方根即最大数限制
for (len = 12; len >= 1; len--)//最大长度为12
{
for (start = 2; start <= sqn; start++)//第一个数由2到sqn
{
mul = 1;
for (j = start; j <len+start; j++)//由第一个数乘len个数
{
mul *= j;
}
if(mul>N)break;//如果乘积大于N,说明当前长度已经不符合了,应该减1
if (N % mul == 0)
{
flag = 1;
break;
}
}
if (flag == 1)//找到了
{
break;
}
}
if (len == 0)//没找到,只能为1
{
printf("%d\n%d", 1, N);
return 0;
}
printf("%d\n%d", len, start);//注意输出格式,最后不能有空格
for (j = 1; j < len; j++)
{
printf("*%d", start + j);
}
return 0;
}