这道题目由于数据很大,所以选用long long类型,算法比较容易想到,但是下面代码一直运算超时,应该改进一些
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<long long> result;
const long long MAX=10000000;
long long factor[MAX],factorLen=1;
void FindConsecutive(long long factor[]);
long long mult(long long& sta,long long& end);
int main(){
long long n;
cin>>n;
for(long long i=2;i<=n;i++){
if(n%i==0)
factor[factorLen++]=i;
}
factor[factorLen]='\0';
FindConsecutive(factor);
if(result.size()==0){
result.push_back(factor[1]);//如果没有连续因数,就只能把除了1之外第二大因数压入
result.push_back(factor[1]);//要一直保证里面至少有两个数
}
vector<long long>::iterator p=result.end();
p--;//由于数组末尾是'\0',所以向前一步</span>
long long sec=*p;
p--;
long long fir=*p;
cout<<sec-fir+1<<endl;
for(long long i=fir;i<sec;i++)
cout<<i<<'*';
cout<<sec;
return 0;
}
long long mult(long long& sta,long long& end){
long long resulto=1;
for(long long i=sta;i<=end;i++)
resulto=resulto*i;
return resulto;
}
void FindConsecutive(long long factor[]){
long long longestLen=0;
for(long long p1=1;p1<=factorLen-1;p1++){
bool flag=false;
long long p2=factorLen-1;//由于数组末尾是'\0',所以向前一步
while(p1!=p2){
if((factor[p1]-factor[p2])==(p1-p2)){//找出最大连续因数
for(long long pTest=p2+1;pTest<=factorLen-1;pTest++){
if(mult(factor[p1],factor[p2])==factor[pTest]&&p2-p1+1>longestLen){
longestLen=p2-p1+1;//最长连续因数个数更新
result.push_back(factor[p1]);//把满足要求的连续的因数全部压入数组中
result.push_back(factor[p2]);
flag=true;
break;
}
}
}
if(flag)//已经找到在当前p1情况下最大的连续因数序列
break;
else
p2--;
}
}
}