一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数N(1<N<231)。
输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
输入样例:
630
输出样例:
3 5*6*7
解题思路:
通过12! < 231 可知最多连续不超过12个数,之后由于小的连续序列一定更长,从最长最小的可能序列开始暴力枚举
1 #include<cstdio> 2 3 int main(void) 4 { 5 int n; 6 scanf("%d", &n); 7 8 int i = 2; 9 while(n % i != 0){ 10 i++; 11 } 12 int m = n / i, max = 0; 13 14 int len, st, first = 1; 15 for(int i = 2; i < m; i++){ 16 int j = i + 1, sum = i; 17 while(sum < n){ 18 sum *= j; 19 j++; 20 } 21 if(sum == n && first){ 22 st = i; len = j - 1; 23 first = 0; 24 } 25 else if(sum == n){ 26 if(j - i > max) max = j - i; 27 } 28 } 29 30 printf("%d\n", max); 31 first = 1; 32 for(int k = st; k <= len; k++){ 33 if(first){ 34 printf("%d", k); first = 0; 35 } 36 else printf("*%d", k); 37 } 38 39 return 0; 40 }