7-84 连续因子 (20分)
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2
31
)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
567
思路:1.方法:暴力求解 用循环把N的所有不同数开头(2开头 3开头 4开头 5 6 7 8 9…).的连续因子求出来(列如 一个数的连续因子有 234 34 4567 …) 题目要求出最长的连续因子 所以在求出一组因子后应该和上一组长度作比较选出最长的。
(注意在选择时 1.要记录最长因子长度 2.记录这组最长因子的开始那个数
为后续输出做准备)
2.思考到底要求多少组连续因子才结束循环尼(因为考虑到程序会超时问题) 其实可以发现一组连续因子(因子数个数为2及2以上)开头那个数不可能大于N的开根(不懂看哈列子 比如 9=33;因为因子数间呈递增关系 所以像求9的时候连续因子开头那个数肯定小于3)
这是限制循环结束的条件
3. 最重要的是如何找出连续因子
其实我们可以利用N%(连续因子积)==0 比如 630 可以分解为 3×5×6×7
630 %(567)==0 这个关系找出
这步代码细节:(t:记录一组连续因子的长度,sum记录因子乘积
i是连续因子的开头数
t=0;
sum=1;
for(j=i;;j++){
sum=j;
if(N%sum==0) t++;
else break;
}
4.关键细节
在求出一组因子后应该和上一组长度作比较选出最长的。
注意在选择时 1.要记录最长因子长度 2.记录这组最长因子的开始那个数
为后续输出做准备)s初始值为0 t为长度 s=t;start=i; 用s和start 记录出最长长度和它的开头数
代码 if(t>s){ s=t; start=i; }
看懂了就开始撸代码吧 加油干就完了
总体代码:
int N;
scanf("%d",&N);
int i;
int sum;
double m=sqrt(N); //注意这里应该用double类型不用int 开方后的数不一定是整数
int j;
int t;
int s=0;
int start;
for(i=2;i<m;i++){
t=0;
sum=1;
for(j=i;;j++){
sum*=j;
if(N%sum==0) t++;
else break;
}
if(t>s){ s=t; start=i;
}
}
printf("%d\n%d",s,start);
while(s-1>0){
printf("*%d",++start);
s--;
}
}