幸运数
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a76e5c6c662c084c460ff883b03650cb.png)
解析:
1. 题意很容易理解
2. 如果用单个数组移项的方式有点麻烦,但也能写出来。 遇到一次能整除的位置(数组下标+1),
后面的数移动的位置要增加1。 例如: 到达第一个能删除的数时,就有了一个空缺,后面都往前移动一位,
到达第二个能整除的索引要往前补两位,同时,整除位置计算是的下标+3.
3. 对于本题,我运用的思路是:
首先一个初始化数组a , 又创建了一个boolean数组b用来标记数组a中的那些位置可以整除幸运数。
创建一个临时数组t, 用来存放不能被幸运数整除的数,再将数组t赋值给数组a,这样就达到了a数组的压缩。
这样数组a的后面会出现一串0(因为数值前移,数组长度不变导致的),在最后统计符合条件的个数时,判断一下即可。
package java_2013_B;
import java.util.*;
public class Main008_幸运数 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int[] a = new int[n / 2];
boolean[] b = new boolean[n / 2];
int[] t = new int[n / 2];
int ans = 0;
for (int i = 0; i < n/2; i++) {
a[i] = 2 * i + 1;
}
for (int i = 1; i < n/2; i++) {
for (int j = 0; j < n/2; j++) {
if (a[i] != 0 && (j + 1) % a[i] == 0) {
b[j] = true;
}
}
int k = 0;
for (int j = 0; j < n/2; j++) {
if (!b[j]) {
t[k++] = a[j];
}
}
for (int j = 0; j < n/2; j++) {
b[j] = false;
}
a = t;
}
for (int i = 0; i < n/2; i++) {
if(a[i]>m && a[i]<n){
ans++;
}
if(a[i]==0) break;
}
System.out.println(ans);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3c54786ce63cd56228d38c45bbf02461.png)