题:

一个正整数 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<stdio.h>
#include<math.h>
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0,j=0, a = 0, sum=0,num = 0,temp=0,qidian1=0,qidian2=0;
int x = sqrt(n);// 连续因子当中最大的那一个 一定会小于这个正整数的平方根
//找连续因子
for (i = 2;i <= x;i++)
{
num = 0;// num 是使用来记录 满足条件的连续数的个数 ,每次使用完后要初始化为0 ,
sum = n;
qidian1 = i; //记录最开始连续的是哪一个数
//判断 i 是否满足是连续的
for (j = i;sum%j==0&&sum!=0;j++)
{
sum /= j;
num++;
}
//筛选最长因子个数
if (num > temp)
{
temp = num;
qidian2 = qidian1; // 记录最长连续因子的 起点
}
}
// 判断是否有连续因子
if (temp == 0)
printf("1\n%d", n);
else
{
printf("%d\n", temp);
i = qidian2;
while (i < qidian2 + temp)
{
if (i != qidian2)
printf("*");
printf("%d", i);
i++;
}
}
return 0;
}