L1-006 连续因子 (20 分)
一个
正整数 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
思路:由题意所给的数据可知数据的连乘最大范围在12!和13!之间,因为1不算,那么最大长度就是11
方法一:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
int flag=0;
con:
for(int len=11;len>0;len--) {//连乘长度,从大到小
for(int i=2;i<=n/i;i++) {//枚举
long sum=1;
for(int j=i;j<len+i;j++) {//最大值为i*(i+1)*..*(i+len);
sum*=j;
if(sum>n)break;//当sum>n时已经不满足条件了,直接终止
}
if(n%sum==0) {
System.out.println(len);
System.out.print(i);
for(int j=i+1;j<i+len;j++) {
System.out.print("*"+j);
}
flag=1;
break con;
}
}
}
if(flag==0)System.out.println(1+"\n"+n);//质数情况
}
}
方法二:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
int count=0,s=0;
for(int i=2;i<=n/i;i++) {
int t=n,m=0;
int j=i;
while(t%j==0) {
m++;
t/=j;
j++;
}
if(m>count) {
count=m;
s=i;
}
}
if(count==0)System.out.println(1+"\n"+n);
else {
System.out.println(count);
for(int i=s;i<s+count;i++) {
if(i!=s+count-1)System.out.print(i+"*");
else System.out.println(i);
}
}
}
}