天梯赛 L1-006 连续因子 (模拟)

一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为356*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数N(1<N<2的31次方)。

输出格式:

首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1因子2……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。

输入样例:

630

输出样例:

3

567

分析:

根据N的值的取值范围小于等于2的31次方,而这个值介于12的阶乘到13的阶乘之间,所以我们可以得到最大的值应该是12个数连续相乘,又因为1不计算在内,所以最多只要有11为连续因子即可。

采用暴力的思想,我们让他分别从2、3、4...sqrt(N)开始乘,连着乘11位、10位...1位。

即连续乘11位时分别为:

2 3 4 5 6 7 8 9 10 11 12相乘

3 4 5 6 7 8 9 10 11 12 13相乘

...

连续乘10位时分别为:

2 3 4 5 6 7 8 9 10 11相乘

3 4 5 6 7 8 9 10 11 12相乘

...

一直到只有一位相乘时,

这其中只要找的一个乘积s,使得N%s==0,我呢么即可认为找到了连续因子。因为iwomen这样找的规律就是符合题目上的先从长度最大的开始找,然后相同长度的里面又从开始的因子小的开始。

为了优化代码,我们可以在每次乘的时候如果当前的乘积已经大于N了,就没有再往下乘的必要了

代码:

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    int main()
    {	 
         int N;
    	 scanf("%d",&N);
    	  int n=sqrt(N);
    	  int i,j;
    	  	long long int sum;
    	  for(int len=11;len>=1;len--)//len控制连续因子的个数,由于N范围的限制最多只能到12的阶乘 
    	     {	     	
    			 for( i=2;i<=n;i++)//连续因子不包括1,从2开始乘,最大乘到N开方就肯定够了 
    			 {
    			    sum=1;
    			 	for(  j=i;j<=len-1+i;j++)//从当前的i开始,乘以的个数为len的长度 
    			 	{
    			 		sum*=j;
    			 		if(sum>N)//到这就没有必要往下算了 
    			 		break;
    			 	}
    			 	if(N%sum==0)//当前的sum值是N的一个因子 
    			 	{
    			 		printf("%d
%d",len,i);
    			 		for(int k=i+1;k<j;k++)
    			 		printf("*%d",k);
    			 		printf("
");
    			 		return 0;
    			 	}
    			 } 
    		 } 
    		 printf("1
%d
",N);//质数的情况 
    	return 0;
    }
原文地址:https://www.cnblogs.com/cmmdc/p/6729680.html