1096 Consecutive Factors (20 point(s))
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<231).
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
输入一个正整数,求出它的连续最长因子。原本是朝着分解质因数的方面去想,实际上暴力即可,毕竟看分写代码。
关于素数问题有一个重要结论,一个数除了1和它本身,不会有大于其平方根的因子。因此本题的思路是,从i=2开始,判断从i开始的连续因子数,如果有更多的因子数量,则更新其长度和开始的数。
关于此题的坑:
最开始循环体是:
for(int i=2;i*i<N;i++){}
这样的话case#5一直不能通过(19分)。原因是这个case中的N可能很大,使得在循环过程中i*i溢出,因此不能跳出循环,出现TLE。解决方案:a. 改成i<=sqrt(N);b. i和N使用long long。巨坑!
不少前辈的代码首先判断素数,实际上本代码起到了同样的效果,还避免了重复计算。
使用queue:https://www.cnblogs.com/mr-stn/p/9217379.html
#include<iostream>
#include<cmath>
using namespace std;
int main(void){
int N; cin>>N;
int ans=0,start;
int m = sqrt(1.0*N);
for(int i=2;i<=m;i++){
int num = N,a = i;
int len = 0;
while(num>=a&&num%a==0){
num/=a;
len++;a++;
}
if(len>ans){
ans=len;start=i;
}
}
if(ans==0) cout<<"1"<<endl<<N<<endl;
else{
cout<<ans<<endl;
for(int i=start;i<start+ans;i++){
if(i==start) cout<<i;
else cout<<"*"<<i;
}
cout<<endl;
}
return 0;
}