这道题主要要看看他的最小的因子可能连续的出现的区域在哪里,和知道素数因子只有自己和1
假设极端的想法,要是只有两个因子,例如4*5=20; int (sqrt(20)=4;要是再多几个因子的话就不会这么靠近他的sqrt。因为越多因子因该是开越多次方,但是我们要找的是因子最小的所以一定是小于sqrt(n);
要是是素数就输出1和他的连续的因子本身。
过程:
介绍变量:s(因子累乘的积),start(确定子序列开始的位置),l(连续因子的个数),j(记录i开始到是s>n停止),i(最小因子所在的区域)
开始的时候先去判断n是否是素数,要是不是素数那么就去他们的区域里面找最小的那个数,然后初始化s(用来存放因子的积),然后用一个循环从i开始直到s<=n;为止,在里面就是去判断因子是否和n整除,要是整除且开始因子个数要大于在此之前累加的因子个数,要是都成立就更新开始值(因为i不会变在找连续的个数的时候
#include<bits/stdc++.h>
using namespace std;
bool prime(int n){
int flag = 1;
for(int i = 2;i <= sqrt(n);i++){
if(n%i==0)flag=0;
}
return flag;
}
int main(){
int n;
cin >> n;
int s,j,l=0,start;
if(prime(n)){
cout << 1 << endl;
cout<< n;
}else{
for(int i = 2;i < sqrt(n);i++){
s = 1;
for(j = i;s <= n;j++){
s*=j;
if(n%s==0&&j-i+1>l){
l = j-i+1;
start = i;
}
}
}
cout << l << endl;
for(int i = start;i < l+start;i++){
if(i == start){
cout << i;
}else cout << '*'<<i;
}
}
return 0;
}
)和更新最长长度