L1-006 连续因子 (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
代码:
#include <stdio.h>
#include <math.h>
int factor(int n,int i);
int check(int p,int q);
int t;
int count;
int num;
int main (){
int max = 1;
int tem;
int j ;
scanf("%d",&num);
j = num; //如果是质数 j是它本身
for(count = 2;count<=sqrt(num);count++){
t = 0;
tem = factor(num,count);
if(tem > max ){
max = tem;
j = count;
}
}
//一种特殊情况 即 不是质数但没有连续因子
// 将J设置为最小因子 而不是它本身
if(max == 1){
for(int i = 2;i<=sqrt(num);i++){
if( num % i == 0)
j = i;
}
}
printf("%d\n",max);
for(int p=1;p<max;p++){
printf("%d*",j);
j++;
}
printf("%d",j);
return 0;
}
int factor(int n,int i){
if(n%i==0 && check(t+1,count)){
t++;
i++;
t = factor(n,i);
}
return t;
} //连续相除 返回相除位数
int check(int p,int q){
int res = 1;
for(int i = 1;i<=p;i++)
{
res *= q;
q++;
}
if(num%res == 0)
return 1;
else
return 0;
} //检查连除的数是否是因子 从q开始连乘p位
1.刚开始写遇到的坑是质数,直接先 j = num;如果是质数直接输出它本身;
2.然后又遇到一个坑如: 14 = 2*7 这类没有连续因子的数
//一种特殊情况 即 不是质数但没有连续因子
// 将J设置为最小因子 而不是它本身
if(max == 1){
for(int i = 2;i<=sqrt(num);i++){
if( num % i == 0)
j = i;
}
}
最后过了