Among all the factors of a positive integer N, there may exist several consecutive numbers. For example, 630 can be factored as 3×5×6×7, where 5, 6, and 7 are the three consecutive numbers. Now given any positive N, you are supposed to find the maximum number of consecutive factors, and list the smallest sequence of the consecutive factors.
Input Specification:
Each input file contains one test case, which gives the integer N (1<N<2
31
).
Output Specification:
For each test case, print in the first line the maximum number of consecutive factors. Then in the second line, print the smallest sequence of the consecutive factors in the format factor[1]factor[2]…*factor[k], where the factors are listed in increasing order, and 1 is NOT included.
Sample Input:
630
Sample Output:
3
5*6*7
就是一道求因式分解的最大连续子序列的。
因为n不能由sqrt(n)和比他大的数相乘得到,所以从2遍历到sqrt(n)即可,sqrt也要取。其实就是暴力,j=i,直到n%j不等于0为止,期间n/=j,且j++循环退出后,判断j-i和maxn哪个大,如果大于,就更新最大长度和最长子序列的起点=i
遍历完后,如果maxn还是为0,证明只能找到为本身的因子,所以输出1和本身
反之输出最大长度,且从起点遍历到起点+长度,输出
这道题给你一个例子就可以理解,输入9,输出1 和 3
输入5,输出5
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main(){
ll n;
cin>>n;
int Sqrt = int(sqrt(n));
int maxn = 0, u = 0;
for(int i = 2; i <= Sqrt; i++){
int j = i;
int sum = n;
while(sum%j==0){
sum /= j;
j++;
}
if(j-i > maxn) {
maxn = j - i;
u = i;
}
}
if(maxn == 0) cout<<"1"<<endl<<n;
else{
cout<<maxn<<endl;
for(int i = u; i <u + maxn;i++){
if(i!=u) cout<<"*";
cout<<i;
}
}
return 0;
}
从2开始遍历到sqrt即可,如果sum%j不为0了,证明连续因子断了,就判断这串连续因子的长度和最大长度哪个长,长久更新,记得记录起始位置(用vector更新也行)
如果最长序列为0,证明这个数为素数,那么因子就是本身,输出本身即可
#include<cmath>
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n;
cin>>n;
int Sqrt = (int) sqrt(n);
int maxCnt = 0;
int u;//序列的初始值
for(int i =2; i <= Sqrt; i++){
int sum = n;
int j = i;
while(sum%j ==0){
sum /= j;
j++;
}
if(j-i > maxCnt){
maxCnt = j -i;
u = i;
}
}
if(maxCnt == 0) cout<<"1"<<endl<<n;
else{
cout<<maxCnt<<endl;
for(int i = u; i < u +maxCnt; i++){
if(i!=u) cout<<"*";
cout<<i;
}
}
return 0;
}