解题思路:
反复的使用删除操作,并且还有数据的移动,emm,用数组我觉得会相当麻烦,于是,选择链表
我觉得理解题意是蓝桥杯一个重点,仔细读
1 | 3 | 5 | 7 | 9 | 11 |
1 | 2 | 3 | 4 | 5 | 6 |
绿色是幸运数,我们删除的应该是,红色部分所对应的数据
然后进行链表的替换,每一次循环,建造一个新链表,然后从旧链表中,选取下标不是幸运数的部分
注意事项:
参考代码:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); int m=in.nextInt(); int n=in.nextInt(); List<Integer>list=new ArrayList<Integer>();//建立一个链表,存放最初的数 list.add(-1); for(int i=1;i<n;i++){//此时为,1,3,5,7 if(i%2==0)continue; else list.add(i); } int count=2; while(true){ List<Integer>temp=new ArrayList<Integer>();//建造一个临时链表 temp.add(-1); int k=list.get(count);//获取需要剔除的数据的小标,比如第一层的k为3 for(int i=1;i<list.size();i++){ if(i%k==0)continue; else temp.add(list.get(i));//temp[1]=1,temp[2]=3,temp[3]=7 } list=temp;//把list替换成temp count++; if(count>list.size()-1)break;//已经把1-n的幸运数筛选完毕 } //现在的list,是1到n之间的,我们现在判断一下 int num=0; for(int i=1;i<list.size();i++){ if(list.get(i)>m)num++; } System.out.println(num); } }
0.0分
3 人评分
C语言程序设计教程(第三版)课后习题6.11 (C++代码)浏览:794 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:865 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1914 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1550 |
P1002 (C语言代码)浏览:1019 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:998 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:702 |
输出正反三角形 (C语言代码)浏览:859 |
WU-拆分位数 (C++代码)浏览:819 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:716 |