2024 蓝桥打卡Day4

蓝桥杯之循环问题

0307打卡
蓝桥杯通常在前3道题目中涉及到循环知识点。

  • for循环:一般能在题目里面找到循环次数。
  • while循环:只知道循环条件,不知道循环次数。
    在考察循环时,还会涉及到集合、字符串等知识点的应用。例如;
  • 对字符串一般考察常用函数。字符串转字符数组,判断结尾等。 考试不让带纸质资料,但是可以用API文档。
  • 集合一般考察特性:list:有序可重复。 set:无序不可重复 map:key-value键值对。

一:for循环和字符串的应用(已知循环次数)

2019 Java C组第一题:

小明对数位中含有2、0、1、9的数字很感兴趣,在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。请问,在1到2019中,所有这样的数的和是多少?

  • 思路分析:
    • 1.获取1-2019每个数字的千位(不为0)、百位、十位、个位。,将每一个数字和2、0、1、9这四个数字进行比较。如果存在,可以累加到变量count上。123对10取模,得到个位3 123/10再对10取模得十位2 , 123/10/10 再对10取模得到百位1.
    • 2.将数字转成字符串。获取每一位得数字。将每一个数字和2、0、1、9这四个数字进行比较。如果存在,可以累加到变量count上。
int count=0;
for(int i = 1 ; i<=2019 ;i++){
 //将数字转成字符串
 String j = i + "";
 //将字符串转成字符数组  toCharArray()
 char[] cs = j.toCharArray();
 for (int k =0; k<cs.length;k++){//2019
     if(cs[k] == '0' || cs[k] == '1'|| cs[k] == '2'|| cs[k] == '9'){
         count += i;
         break;
     }
 }
}
System.out.println(count);

2015年java C组第二题:

一些数字的立方的末尾正好是该数字本身。 比如:1,4,5,6,9,24,25,…;请你计算一下,在 10^4以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。

  • 分析:已知循环次数,用for循环。可以将数字和数字得立方转成字符串。str.endsWith(str2):判断字符串str是否以字符串str2结尾。
int count=0;//计数器
for (long i =1 ; i <=10000 ; i++){
 String i1 = i+"";
 String i2 = (iii)+"";
 if(i2.endsWith(i1)){
     count++;
 }
}
System.out.println("满足条件得数字有:"+count);

二:while循环:已知循环条件。满足条件就一直执行

2019年Java C组第二题

小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。例如,对于一块两边分别为 5 和 3 的材料(记为5×3),小明会依次切出3×3、2×2、1×1、1×1 共4个正方形。
现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会切出多少个正方形?

  • 分析:只知道循环终止条件,不确定循环次数。用while循环。
int length = 2019;
int width= 324;
int count =0;//切出正方形得个数
while (true){
 if(length >width){//长》宽
     count ++;
     length -= width;
 }else if(width >length){//宽》长
     count++;
     width -= length;
 }else if(width ==length&& width!=0){//长==宽
     count++;
     width -=width;
     length -= length;
 }else if(width ==0){
     break;
 }
}
System.out.println(count);

18年Java C组第一题

小明被不明势力劫持。后莫名其妙被扔到 X 星站再无问津。小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文。他决定在 X 星战打工。好心的老板答应包食宿,第1天给他1元钱。并且,以后的每一天都比前一天多2元钱,直到他有足够的钱买票。请计算一下,小明在第几天就能凑够 108元,返回地球。

  • 分析:循环次数布置,循环终止条件已知。使用while循环,终止条件:总工资>=108元。
int sum = 0;//总钱数
int i =1;//每天挣得钱数。
int day =0;//总天数
while (true){
 sum+=i; //总天数加上每天挣得钱
 day +=1;//天数+1
 if(sum >=108){
     break;
 }
 i += 2;//后一天比前一天多挣2元
}
System.out.println(day);

18年Java C组第二题

5只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。第2只猴子醒来,把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。第3只猴子醒来,把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。第4只猴子醒来,把香蕉均分成5堆,还剩下4,就吃掉并把自己的一份藏起来继续睡觉。
第5猴子醒来,重新把香蕉均分成5堆,哈哈,正好不剩!
请计算一开始最少有多少个香蕉。
分析:不知道香蕉得数量,设为n个。用while循环。满足下面得条件结束:

  1. n%5 =1 a= (n-1)/5*4
  2. a%5 =2 b= (a-2)/5*4
  3. b%5 =3 c= (b-3)/5*4
  4. c%5 =4 d=(c-4)/5*4
  5. d%5 =0 d>0
int n= 1;//代表香蕉得数量
while(true){
 if(n %5 ==1){
     int a =(n-1)/54;
     if(a%5 ==2){
        int b= (a-2)/54;
        if(b%5 ==3){
           int c= (b-3)/54;
           if(c%5 ==4){
               int d=(c-4)/54 ;
               if(d%5 ==0 && d>0){//d>0隐藏条件
                   break;
               } } } } }
 n++;
}
System.out.println(n);

三:字符串循环和集合的使用

  • 对集合的考察集中在集合的特性和功能。set唯一性。list有序性。以及集合元素的个数。

2019java C组第三题

一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成的串。例如,字符串 aaab有非空子串 a, b, aa, ab, aaa, aab, aaab一共 7个。注意在计算时,只算本质不同的串的个数。
请问,字符串 0100110001010001有多少个不同的非空子串?
分析:set的唯一性,去除重复的子串

  • aaab从第一个下标开始截取: a aa aaa aaab
  • 从第二个下标开始:a aa aab
  • 下标0 截取的范围:[0,最大下标].
  • 下标1的截取范围:[1,最大下标]
  • 截取的方法:subString(i,j):截取子串
String string = "0100110001010001";
HashSet<Object> set = new HashSet<>();//去重
for (int i =0; i<string.length() ;i++){//控制从第几个下标开始截取
 for (int j =i ; j<string.length() ; j++){
     String s = string.substring(i, j+1);
     set.add(s);
 }
}
System.out.println(set.size());

2015java C组第6题

小明发现了一个奇妙的数字。它的平方和立方正好把 0 ~ 9 的 10 个数字每个用且只用了一次。你能猜出这个数字是多少吗?

  1. 平方和立方通过取模求出每一位(不推荐)
  2. 通过字符串操作,去求每一位,放入set,看长度是否为10
int i =1;
while (true){
 HashSet<Object> set = new HashSet<>();
 int ping = ii;
 int li = ii*i;
 String string = ""+ping + li;
 if(string.length() ==10){
     System.out.println(string);
     char[] cs = string.toCharArray();
     for (int j =0 ; j<10; j++){
         set.add(cs[j]);
     }
     if(set.size() ==10){//找到了
         System.out.println(i);
         break;
     }
 }
 i++;

四:循环求质数

  • 质数就是只能被1和它本身整除的数字。最小的质数是2.
  • 如何判断一个数字n是不是质数:找一下[2,n-1]有没有能被n整除的数字,有就不是质数。
  • 整除:n对数字取余为0

2019java C组第四题

我们知道第一个质数是2,第二个质数是3 , 第三个质数是5…
请你计算第2023个质数?
分析:我们可以先去求质数,然后把求到的质数放入一个list里面。取出下标为2022的,就是第2023个质数。

ArrayList<Object> list = new ArrayList<>();
for (int i=2; i<=20000;i++){
 int a =0;//记录有没有除了1和它本身之外的可以整除的数字。
 for (int j =2 ; j<i;j++){
     if(i%j ==0){
         a++;
         break;//只有找到一个能被整除的就退出内层循环,提高运算效率
     }
 }
 if(a==0){
     list.add(i);
 }
}
System.out.println(list.get(2022));
  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值