L1-006 连续因子
题目链接-L1-005 考试座位号
解题思路
- 先判断n是否为素数,若为素数直接输出1 n
- 若不为素数,一个for循环找n的因数i,因为是连续因子个数然后i乘到n,每乘一次判定当前乘积pre是否为n的因子(即N%pre是否为0)
1. 若pre为n的因子,比较上一次乘积因子序列的长度,若大于,则记录;
2. 若pre不是n的因子就结束内层循环继续找下一个因子 - 判断pre是不是n的因子其实就意味着判断乘上去的那个连续的因子成不成立
- 不断更新乘积因子序列长度,直到最后一个因子为n
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int isprime(int x){
if(x==1)
return 0;
for(int i=2;i*i<=x;i++)
if(x%i==0)
return 0;
return 1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
if(isprime(n)){
cout<<1<<endl<<n;
return 0;
}
int len=0,pre,x;
//len记录最大长度,pre记录连续因子乘积,x记录连续因子开头数字
for(int i=2;i*i<=n;i++){
if(n%i==0){//如果i是n的因子
pre=i;
int j;
for(j=i+1;j*j<=n;j++){
pre*=j;
if(n%pre!=0)//判断j的合理性
break;
}
if(j-i>len){//比较长度
len=j-i;
x=i;
}
}
}
cout<<len<<endl;
for(int i=x;i<=x+len-1;i++){
if(i!=x)
cout<<"*";
cout<<i;
}
return 0;
}