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分解为多个数的乘积(不包括1),找出其中的连续乘积整数,并比较他们的长度,输出最大长度,以及对应最大长度的连续数(按递增输出),如果有多个长度相等的连续数,则输出起始数最小的那个
这道题蛮难的(大家好好体会,不太好想)
AC代码
#include<stdio.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
int k=(int)sqrt(1.0*n);//连续数大小不会超过sqrt(n)
int len=0,ans=0;//len代表连续数的长度,ans代表连续数的起始位
for(int i=2;i<=k;i++){//从2开始
int temp=1,j=i;
while(1){
temp=temp*j;//连续数乘积
if(n%temp!=0)break;//如果n%temp不为0,说明temp这个数不能做n的除数,就要否定之前的所有数,重新开始
if(j-i+1>len){//更新长度
len=j-i+1;
ans=i;//更新起始位
}
j++;//j自增接着进行while判断,更新len,ans
}
}
if(len==0){
printf("1\n%d",n);
}else{
printf("%d\n",len);
for(int i=0;i<len;i++){
printf("%d",i+ans);
if(i<len-1){
printf("*");
}
}
}
printf("\n");
return 0;
}
注意:起始代码中的temp变量类型应替换成long long型的,因为当N比较大时候,同时i也乘到的一个比较大的位置这个时候temp的累乘就会出现溢出,导致错误。不过pat测试点中并没有这种情况。