一个正整数 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
问题分析 :
要判断一个数m是不是数n的因子,只需要看看这个数n对数m取模的值是否为零,如果为0,则数m是数n的因子。按照题意,一个数的连续因子只可能发生在这个数的平方根及其前面的因子,所以我们只需要查看从数2开始的因子连续因子数目,记录下来,然后再查看数3开始的连续因子数目,记录下来,以此类推直到数n的平方根。其中连续最长的长度最长的就是我们要找的。
注:并不是让你写出n所有的因子然后判断连续因子的长度,而是一次分解的因子连续因子的长度
两者并不相同。
代码实现
#include<stdio.h>
#include<math.h>
int main(){
int n,j=0,y,num=0,maxnum=0,start=2;
scanf("%d",&n);
for(int i=2;i<=sqrt(n);i++){//一个数的连续因子只可能发生在这个数的平方根前面
y=n;
num=0;
for(int j=i;y%j==0&&j<=y;j++){//y%j==0用来确定j是y的因子,如果y<j说明后面的j不再属于这一次分解的因子了
y/=j;
num++;//为什么这个循环能够确保连续的话就进行长度的加一
//因为y%j==0作为循环的条件且j每一次只加1,是连续增加的,如果y%j!=0说明因子在这里中断了,因为连续的因子只可能出现在这一次分解的前面所以跳出循环
}
if(num>maxnum){//如果这一次分解的连续因子长度大于已经记录的长度进行更新
maxnum=num;
start=i;
}
}
if(maxnum==0){//如果满足这一个条件说明这是一个质数他的因子只有1与其本身1不输出只输出本身
printf("1\n");
printf("%d",n);
}else{
printf("%d\n",maxnum);
int xstart=start;
while(xstart<start+maxnum){//已经确定在从xstart这一数开始往后数共maxnum个数都是连续的因子
if(xstart!=start){//第一个输出不需要打印*
printf("*");
printf("%d",xstart);
}else{
printf("%d",xstart);
}
xstart++;
}
}
return 0;
}