天梯赛练习集 L1-006 枚举

题意:

一个正整数 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 ;
		 }
	  }
   }
} 

猜你喜欢

转载自blog.csdn.net/Irving0323/article/details/88613700