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;
}
本文介绍了一种算法,用于找出正整数N的所有因子中,最长的连续因子序列。通过从2开始遍历并检查连续因子的数量,文章提供了一个有效的解决方案,并讨论了循环条件可能导致的溢出问题。
881

被折叠的 条评论
为什么被折叠?



