一个正整数 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<iostream>
#include<cmath>
using namespace std;
int isPrime(long long n){ //判断质数的函数
if(n == 0 || n == 1)return 0;
for(int i = 2;i <= sqrt(n);i++){
if(n%i == 0)return 0;
}
return 1;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
long long first;
long long len = 0;
long long n;
cin >> n;
if(isPrime(n)){ //如果是质数,则直接输出这个数,然后return 0结束
printf("1\n%d",n);
return 0;
}
for(long long i = 2;i <= n/2;i++){ //遍历2到n/2
long long mul = 1; //定义一个用来乘的数
//一定要有=号!
for(long long j = i;j <= n/mul;j++){ //把i当做第一个数,然后让mul不断被乘
mul *= j; //且j不断++,当找到了恰好使得n
if(n % mul == 0 && j-i+1 > len){ //可以被mul整除时,且长度"j"更大
first = i; //使first指向第一个数,用于之后输出
len = j-i+1; //更新长度最大值
}
}
}
//接下来是输出环节
printf("%d\n",len); //输出最终最大长度
printf("%d",first); //先输出第一个数字
for(long long i = first+1;i < first + len;i++){ //再输出剩下的
printf("*%d",i);
}
printf("\n");
return 0;
}