解题思路:
用ArrayList数组从1开始存储数字,求出1到n的所有幸运数,然后根据m,得到m到n之间的所有幸运数。
参考代码:
import java.util.ArrayList; import java.util.Scanner; //第八题:幸运数 public class one9 { public static void main(String[] args) { Scanner in = new Scanner(System.in); //定义范围上下限 int m = in.nextInt(); int n = in.nextInt(); //存储从一到n的数字,之所以到1到n,原因是题目要求的是从1开始到无穷尽的数字之间,的所有幸运数,然后在得到m到n之间的幸运数。 ArrayList<Integer> arrayList = new ArrayList<>(); //给数字0下标的位置随便设置一个数,为了使开始时下标为几存储的数字就为几 arrayList.add(-1); //给数组添加数字 for (int i=1;i<=n;i++){ arrayList.add(i); } //数组的第二个数字为幸运数,也就是2 int x=2; //a数组的下标 int index=0; //该题目是下标%幸运数为0的下标都要删除,a数字存储的就是被删除的下标 int [] a = null; //b数组存储每一个幸运数的具体值 int [] b = new int[n]; //b数组的下标 int bIndex=0; //开始存储第一个幸运数2,之所以先把第一个幸运数存储并且删除所有下标能整除2的下标的数,是因为之后我们的幸运数都是arrayList的下标加一,看不懂没关系,后面也会说 b[bIndex++]=arrayList.get(2); //先创建一次a数组,用来存储幸运数为2的时候删除数字的下标 a = new int[arrayList.size()]; //找到要删除的数字的下标 for (int i=1;i<=arrayList.size()-1;i++){ if (i%arrayList.get(x)==0){ a[index++]=i; } } //从a数组的后面开始删除,如果从前面开始删除,假如先删除下标为2的数字,那么删除后,arrayList数组中原来下标为4的数字,就变成3了,就无法删除了。 for (int i=index-1;i>=0;i--){ arrayList.remove(a[i]); } //大于等于arrayList长度的时候在停止的原因是:要把所有的幸运数都存储起来,就要遍历一遍,以1到20为例,幸运数为2,3,7,9,13,15, while (x<arrayList.size()){ //幸运数不同时,a数组下标清零,重新创建a数组 index = 0; a = new int[arrayList.size()]; //记录该幸运数 b[bIndex++] = arrayList.get(x); //判断下标处是否该被删除 for (int i=1;i<=arrayList.size()-1;i++){ if (i%arrayList.get(x)==0){ a[index++]=i; } } //从后往前删除arrayList数组 for (int i=index-1;i>=0;i--){ arrayList.remove(a[i]); } //幸运数等于arrayList数组的下一个数字,这也是为什么上面代码要先把幸运数字2先记录下的原因,如果不先记录下来,因为2太小,导致删除可以整除2的下标数字后,下一个幸运数3到了原来2的位置,导致3这个幸运数就得不到,所以只能先把2搞出去。 x++; } int sum=0; for (int i=0;i<b.length;i++){ if (b[i]>m&&b[i]!=n){ sum++; } } System.out.println(sum); } }
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1046 |
简单的a+b (C语言代码)浏览:528 |
C语言训练-排序问题<1> (C语言代码)浏览:636 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:901 |
Cylinder (C语言描述,蓝桥杯)浏览:1279 |
C语言训练-数字母 (C语言代码)浏览:648 |
矩阵加法 (C语言代码)浏览:1769 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:650 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:653 |
上车人数 (C语言代码)浏览:753 |