一个正整数 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
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
int yinz[100];
scanf("%d", &n);
int p = 0;
//1、求n可能连续的因子
for (int i = 2; i < sqrt(n) + 1; i++) {
if (n % i == 0) {
yinz[p++] = i;
}
}
//当n为素数时
if (p == 0) {
yinz[p++] = n;
}
//2、在n所有的因子里求最长连续因子
//maxf记录最长连续因子的第一个因子,maxl记录最长连续因子的长度
//maxl=1,当最长为1时没有进入if语句此时最长长度为1
int maxf = 0, maxl = 1;
//sum记录连续因子的乘积,x记录连续因子长度
int sum=1, x=1;
for (int i = 0; i < p; i++) {
sum = yinz[i];
x = 1;
for (int j = i + 1; j < p; j++) {
if (yinz[j] == yinz[j - 1]+1) {
sum = sum * yinz[j];
if (n % sum == 0) {
x++;
if (x > maxl) {
maxl = x;
maxf = i;
}
} else {
j = p;
}
} else {
j = p;
}
}
}
//输出
printf("%d\n", maxl);
for (int i = maxf; i < maxf + maxl; i++) {
if (i == maxf) {
printf("%d", yinz[i]);
} else {
printf("*%d", yinz[i]);
}
}
return 0;
}