原题链接:蓝桥杯2013年第四届真题-幸运数
解题思路:
用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语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复