连续因子
一个正整数 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
这题的题意貌似有点表达错误,他要输出最长连续因子个数,然后下一行需要输出的其实就是那个最长连续因子组成的序列。并不是所谓的最小连续因子序列。
这里用暴力穷举处理了这个问题。
1.首先我们得知道求一个数的因子我们不需要一直寻找到那个数,只需要穷举到那个数的根号为止就好了。例如:25,取根号得5。我们只需要穷举到5就好了。因为大于五的话如5 * 6 = 30;这已经超过25了连续因子只能小于5的范围内超出5,不存在那种连续因子。
2.求连续因子,我们得知道连续因子的特点。正如题目给的例子。
630 = 3 x 5 x 6 x 7
630 = 3 x 5 x 42
630 = 3 x 210
不难看出5,6,7不仅是630的因子也是210的因子,6,7也是42的因子。所以我们找630的连续因子的时候可以这么做,先找的有个可以整除630的有个数,然后给这个数加一再试试能不能继续整除。
例如
2可以整除630得315。2+1得3,但是3不是315的因子不能整除,因此不能形成连续因子,继续往下找,
3可以整除630得210。3+1得4,但是4不能整除210,因此不能形成连续因子。
4本身就不能整除630,直接舍弃
5可以整除630得126。5+1得6,6可以整除126得21,6+1得7,7也能整除21得3,7+1得8,8不能整除3结束寻找5开头的连续因子。并记录。
630 = 3 x 7 x 6 x 5
630 = 21 x 6 x 5
630 = 126 x 5
以此类推一直寻找到根号630
AC代码(c语言)
#include<stdio.h>
#include<math.h>
int main(void)
{
int n;
scanf("%d", &n);
int k = sqrt(n) + 1; /*取根号可能会出现小数点被舍弃的情况
导致无法枚举出所以情况,加1即可包含所有情况
避免丢失。*/
int i, j;
int max = 0, count = 0, start = 0;
int temp = n;
for (i = 2; i < k; i++)
{
if (n % i != 0)
continue;
temp = n; //临时存储n的值防止n被改变
j = i;
count = 0;
while (temp % j == 0) //一直寻找连续因子
{
temp /= j;
j++;
count++; //统计
}
if (count > max) //记录最优结果
{
max = count;
start = i;
}
}
if (max == 0) //特殊处理质数
printf("1\n%d", n);
else
{
printf("%d\n", max);
printf("%d", start); //格式输出
for (i = start + 1; i < start + max; i++)
printf("*%d", i);
}
return 0;
}