原题链接:蓝桥杯2013年第四届真题-幸运数
解题思路:
开始数字存放放在list集合中
| list下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 数字序列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 数字序号 | 1 | 2 | 3 | 4 | 5 | 6 |
第一轮:幸运数字2(list初始化可以直接填入下列数字序列)
| list下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 数字序列 | 0 | 1 | 3 | 5 | 7 | 9 | 11 |
第二轮:幸运数3
剔除后:
| list下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 数字序列 | 0 | 1 | 3 | 7 | 9 |
缩紧后:
| list下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 数字序列 | 0 | 1 | 3 | 7 | 9 | 13 | 15 |
...........
参考代码:
import java.util.ArrayList;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
//定义集合List去存放数字序列
ArrayList<Integer> list = new ArrayList<>();
//由于数字序列1 2 3..是从下标1开始计算的
//为了方便,将集合0索引的数字设置为0
list.add(0);
//第一轮剔除,剔除幸运数字2的倍数的下标位置
for(int i = 1;i<n;i++){
//如果集合索引是幸运数字2的倍数,则跳过
if(i % 2 == 0){
continue;
}
//如果不是,则添加进集合中
list.add(i);
}
//定义变量记录幸运数字索引
int luckIndex = 2;
//使用While循环实现剔除幸运数字倍数的下标
while(true){
//定义临时集合temp,用于存放每一轮剔除后的数字序列
ArrayList<Integer> temp = new ArrayList<>();
temp.add(0);
//定义变量记录幸运数字的值
int luckNum = list.get(luckIndex);
//遍历集合list
for(int i = 1; i < list.size(); i++){
//若为幸运数字倍数的下标,则跳过
if(i % luckNum == 0){
continue;
}
//否则,就添加入临时集合temp中
temp.add(list.get(i));
}
//上一轮剔除结束,下一轮开始
luckIndex++;
//将上一轮的数字序列重新赋给list
list = temp;
//当幸运数字下标超过集合list最大索引list.size()-1,则跳出while循环
if(luckIndex > list.size()-1){
break;
}
}
//定义变量记录符合要求的个数
int count = 0;
for (int i = 1; i < list.size(); i++) {
int num = list.get(i);
if(num > m){
count++;
}
}
System.out.println(count);
}
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复