1、题目描述
题目链接

2、题目分析 + 解决
(1)
public static void main2(String[] args) {
Scanner scanner = new Scanner(System.in);
int begin = scanner.nextInt();
int end = scanner.nextInt();
int len = end - begin + 1;
int[] map = new int[len];
for (int i = 0; i < len; i++) {
map[i] = begin++;
}
int[] result = new int[len];
result[0] = 0;
result[1] = -1;
for (int i = 2; i < len; i++) {
for (int j = i - 2; j >= 0; j--) {
int diffe = map[i] - map[j];
if(diffe > map[j]/2){
break;
}
if(map[j] == -1 || map[j] % diffe != 0){
continue;
}
if(result[i] == 0){
result[i] = result[j] + 1;
} else {
result[i] = Math.min(result[j] + 1, result[i]);
}
}
if(result[i] == 0){
result[i] = -1;
}
}
System.out.println(result[len - 1]);
}
(2)换种方法
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int begin = scanner.nextInt();
int end = scanner.nextInt();
int len = end - begin + 1;
int[] map = new int[len];
for (int i = 0; i < len; i++) {
map[i] = begin++;
}
int[] result = new int[len];
for (int i = 1; i < len; i++) {
result[i] = -1;
}
for (int i = 0; i < len; i++) {
// 1. 说明不能跳到这个位置
if(result[i] == -1){
continue;
}
// 2. 求 map[i] 的因子
Set<Integer> set = div(map[i]);
// 3. 更新当前位置所能跳到的位置 的最小步数
for (int val : set) {
if(i + val < len){
if(result[i + val] == -1){
result[i + val] = result[i] + 1;
} else {
result[i + val] = Math.min(result[i + val], result[i] + 1);
}
}
}
}
System.out.println(result[len - 1]);
}
public static Set<Integer> div(int val){
Set<Integer> set = new HashSet<>();
for (int i = 2; i <= Math.sqrt(val); i++) {
if(val % i == 0 ){
set.add(i);
set.add(val / i);
}
}
return set;
}
渤海名市,尚武之乡
河北沧州
