//题意:求一个数的最大的连续因数个数,例如: 8064 = 2*3*4*6*7*8
//- 最大的连续因子个数为3个:{2,3,4},{6,7,8}。
//- 如果存在相同个数的连续子序列,输出较小的那个。
//思路分析:如果输入n为素数,那么因数只可能为自己,因为题目说了不包括1。故第一行输出1,第二行输出n。
//如果一个数为合数,则该数的因数的最大上限为sqrt(n)。
//使用一个二重循环,外层循环枚举i从2到sqrt(n)表示枚举第一个因数。内层循环枚举j从i到sqrt(n)表示所有连续的因数
//temp为当前所有因数乘积(因数不相同),temp *= j。当(n%temp != 0)时则退出循环,然后看当前
//因子个数j-i是否比Max要大,大则更新当前Max,并将first设置为i。
//第一行输出Max,并从第二行first开始输出Max个连续数字。
#include <bits/stdc++.h>
using namespace std;
bool isprime(int n) {
if(n <= 0 || n == 1) return false;
int sqrn = sqrt(n);
for(int i = 2;i <= sqrn;i++)
if(n % i == 0) return false;
return true;
}
int main(void){
int n;cin>>n;
if(isprime(n)) //如果是素数直接输出1和n
cout<<1<<endl<<n;
else {
int first = 0,maxn = sqrt(n);
int Max = 0; //最大的连续因子长度
for(int i = 2;i <= maxn;i++) { //遍历第一个可能的因数
int j,temp = 1;
for(j = i;j <= maxn;j++) { //遍历所有可能连续的因数
temp *= j;
if(n % temp != 0) break; //如果当前的数不是因数
}
if(j - i > Max) {
Max = j - i;
first = i;
}
}
cout<<Max<<endl;
for(int i = 0;i < Max;i++) {
if(i > 0) cout<<"*";
cout<<first + i;
}
}
return 0;
}
转载于:https://www.cnblogs.com/Western-Trail/p/10356301.html