题目要求
题目分析
有一个测试点没有通过测试,现在的最高得分还是18分,直接贴代码了。希望朋友们多多指教
示例代码
import java.util.ArrayList;
import java.util.Scanner;
public class L1_006 {
public static void main(String[] args) {
//读取输入数
Scanner input = new Scanner(System.in);
int number = input.nextInt();
input.close();
//获取这个数的所有因子并将结果保存在一个ArrayList当中
ArrayList<Integer> list = new ArrayList<Integer>();
//为了缩短获取因子的时间 奇数的因子不可能是偶数 所以从3开始依次增加2
int a = 0, b = 0;
if(number % 2 == 0) {
a = 2;
b = 1;
} else {
a = 3;
b = 2;
}
//如果因子大于Math.sqrt(number) 任意连续两个因子的乘积一定大于这个数 没有求解的必要 但是要考虑到素数这个特殊情况 下面会有特别的处理
while(a <= Math.sqrt(number)) {
if(number % a == 0) {
//i 是这个数的一个因子
list.add(a);
}
a += b;
}
//容器大小
int length_list = list.size();
//对于素数 只有1和它本身 题目要求1除外 就只剩下本身了
if(length_list == 0) {
System.out.println("1");
System.out.println(number);
//结束程序运行
return;
}
//打印查看因子
// for(int i = 0; i < length_list; i++) {
// System.out.print(list.get(i) + " ");
// }
// System.out.println();
//连续因子中的最后一个
int end = list.get(0);
//最大连续因子数
int count_max = 1;
//连续因子数
int count = 1;
//连续因子相乘的结果
int num = list.get(0);
//遍历容器寻找连续因子
for(int i = 0; i < length_list - 1; i++) {
if(list.get(i) + 1 == list.get(i + 1)) {
//连续
count++;
num *= list.get(i + 1);
if(num > number) {
//连续因子相乘的结果大于这个数本身
if(count_max == 1 && end == list.get(0)) {
//如果之前没有出现过连续因子 截取目前的这个因子
count_max = count - 1;
end = list.get(i);
} else {
//看目前的这个连续因子的个数是否大于之前的 如果大于 替换掉
if(count - 1 > count_max) {
count_max = count - 1;
end = list.get(i);
}
}
//结束遍历
break;
}
} else {
//不连续
if (count > count_max) {
count_max = count;
end = list.get(i);
}
//重新开始寻找连续因子
count = 1;
num = 1;
}
}
//输出结果
System.out.println(count_max);
for(int i = count_max; i > 0; i--) {
System.out.print(end + 1 - i);
if(i != 1) {
System.out.print("*");
}
}
}
}