题意:
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。1不算在因子序列内。1 < N < 2^31.
题解:
1.11! < 2 ^ 31 < 12! ,因此最长连续因子的个数不超过11 。可以从大到小的枚举连续因子序列的长度,从小到大的枚举连续因子序列的起始值。
2.注意为了减小复杂度,枚举起始值不超过sqrt(N)。但是需要特判质数。
#include<bits/stdc++.h>
using namespace std ;
bool prime(long long n)
{
long long i , j ;
long long temp2 ;
temp2 = ceil(sqrt(n)) ;
for(i = 2 ; i <= temp2 ; i ++)
if(n % i == 0)
return 0 ;
return 1 ;
}
int main()
{
long long i , j , k , p ;
long long n ;
long long temp1 , temp2 ;
scanf("%lld" , &n) ;
if(prime(n))
{
printf("1\n%lld" , n) ;
return 0 ;
}
temp2 = ceil(sqrt(n)) ;
for(i = 11 ; i >= 1 ; i --)
{
for(j = 2 ; j <= temp2 ; j ++)
{
temp1 = 1 ;
for(k = j ; k <= j + i - 1 ; k ++)
{
temp1 *= k ;
}
if(n % temp1 == 0)
{
printf("%lld\n" , i) ;
for(k = j ; k <= j + i - 2 ; k ++)
{
printf("%lld*" , k) ;
}
printf("%lld" , j + i - 1) ;
return 0 ;
}
}
}
}