1096 Consecutive Factors (20 分)
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
题目大意:
给出一个整数n,并对其进行因子分解,求最大连续序列的因子个数以及输出最小连续序列。
思路:
问题分解为求因子与判断是否为连续序列。从低到高依次枚举,最小为2,最大不超过根号n,每次枚举一个数i,就去验证是否存在以i开头的因子序列:令temp 记录乘积,并且用j 继续进行连续序列的枚举,一旦发现n % temp != 0, 那么就枚举下一个i;否则则实时更新最长的长度以及开头的那个数。最后输出 ansi ~ ansi + anslen – 1的所有数就可以了。
如果最后发现anslen == 0,那么肯定该数是素数,只有自身为其因子。
参考代码:
#include<cstdio>
int main(){
long long n, ansi = 0, ansl = 0;
scanf("%lld", &n);
for(long long i = 2; i * i <= n; ++i){
long long temp = 1, j = i;
while(1){
temp *= j;
if(n % temp != 0) break;
if(j - i + 1 > ansl) ansl = j - i + 1, ansi = i;
j++;
}
}
if(ansl == 0) printf("1\n%lld", n);
else{
printf("%lld\n%lld",ansl, ansi);
for(int i = ansi + 1; i < ansi + ansl; ++i) printf("*%lld", i);
}
return 0;
}