题意
给出一个正整数n,让你求出其最长连续因子、
我好像用了最chun的方法,枚举出了全部的结果
首先计算与n最接近且大于n的2的幂 2x>=n2^x>=n2x>=n
最长连续因子的个数t<=x,所以从1到x开始进行不断枚举
题解
#include<fstream>
using namespace std;
bool isPrime(int x){
// if(x==1||x==0) return false;
// if(x==2||x==3) return true;
//
for(int i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
return true;
}
int main(){
int n;
int len=1;
int counter=0;
cin>>n;
while(len<n && len>0){
len=len<<1;
counter++;
}
bool temp=isPrime(n);
if(temp){
cout<<"1"<<endl<<n;
return 0;
}
if(n==0) cout<<"0"<<endl;
string x[counter+5];
int has[counter+5];
int cur_len=1;
for(int i=0;i<counter+5;i++)
has[i]=0;
while(cur_len<counter){
if(cur_len==1){
for(int i=2;i*i<=n;i++){
if(n%i==0){
if(i>=10){
x[cur_len]+=(i/10+'0');
x[cur_len]+=(i%10+'0');
has[cur_len]=1;
break;
}
else{
x[cur_len]+=('0'+i);
has[cur_len]=1;
break;
}
}
}
}else{
//长度大于1时,利用循环求值
long long multi=1;
long long start=2;
while(multi<n&&multi>0){
multi=1;
for(int i=0;i<cur_len;i++){
multi*=(start+i);
}
if(multi>n||multi<=0) break;
if(n%multi==0){
for(int i=0;i<cur_len-1;i++){
if(start+i>=10){
x[cur_len]+=((start+i)/10+'0');
x[cur_len]+=((start+i)%10+'0');
}
else{
x[cur_len]+=(start+i+'0');
}
x[cur_len]+='*';
}
if(start+cur_len-1>=10){
x[cur_len]+=((start+cur_len-1)/10+'0');
x[cur_len]+=((start+cur_len-1)%10+'0');
}
else{
x[cur_len]+=(start+cur_len-1+'0');
}
has[cur_len]=1;
break;
}
start++;
}
}
cur_len++;
}
for(int i=counter+5;i>=1;i--){
if(has[i]==1){
cout<<i<<endl<<x[i]<<endl;
break;
}
}
}