【Java算法01】循环

蓝桥杯概况

一共十道题,前五题填空题,后五题代码题(需要提交代码)

难度:从易到难

获奖人数:一等奖10%,二等奖20%,三等奖30%

蓝桥杯通常在前三道题目中涉及到循环知识点
for循环:一般能在题目里找到 循环次数
while循环:只知道循环条件,不知道循环次数
在考查循环时,还会涉及到集合、字符串等知识点的应用。
例如:1. 对字符串考察常见函数。字符串转字符数组,判断结尾等。
2.集合一般考察特性:list:有序可重复。set:无序不可重复。map:key-value键值对

for循环和while循环

  1. 已知循环次数使用for循环

  1. 不知道循环次数,但知道循环条件,使用while循环

  1. 解题思路中需要设方程求解,需要设置未知数x,使用while循环(相当于不知道循环次数,需要从x=1开始,一个一个往上加直到符合退出循环的条件)

字符串循环和集合的使用

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

2019年javaC组第三题

循环求质数

质数就是只能被1和它本身整除的数字。最小的质数是2!!

如何判断一个数字它是否是质数???

答:找一下在[2,n-1]有没有能被n-1整除的数字,有的话就不是质数

  • 整除:n对数字取余为0

2019java C组第四题

习题

__01__

package Day01_for;
// 1到2019的所有数字中,有出现2,0,1,9的数字之和为多少?
public class pb01 {
    public static void main (String[] args)
    { 
        // 思路:将1到2019中的每个数都拿出来,挨个儿检查是否是符合题意的数,是的话就相加
        int nums = 2019;
        int sum = 0;
        int ans = 0;
        for(int i = 0;i < nums;i ++) {
            // ??如何获取每个数字上的千位、百位、个位
            // 答:取模!但是太麻烦了。。。。。
            // 将数字转化为字符串。获得每一位上的数字。
            
            // 加上空字符串进行转换
            String str = i + "";
            // 将字符串转成字符数组    toCharArray()
            char[] chars = str.toCharArray();
            for(int j = 0;j < chars.length;j ++) {
                if(chars[j] == '0' || chars[j] == '1' || chars[j] == '2' || chars[j] == '9') {
                    sum += i;
                    // 防止重复相加
                    break;
                }
            }
        }
        ans = sum;
        System.out.println(ans);
    }
}

__02__

package Day01_for;
// 数字立方的末尾正好是它本身,在10^4以内,这样的数字正整数有多少个
public class pb02 {
    public static void main(String[] args) {
        //思路:1到10000中一个一个拎出来,符合题意的数字记录
        int nums = 10000;
        int count = 0;
        for(long i = 1;i < nums;i ++) {
            String a = i + "";
            String b = i*i*i + "";
            if(b.endsWith(a)) {
                count ++;
                System.out.println(a);
                System.out.println(b);
                System.out.println("---------------------");
            }
        }
        
        System.out.print(count);
    }
}

__03__

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

public class pb03 {
    public static void main(String[] args) {
        // 思路:只知道循环终止条件,不确定循环次数。用while循环。
        // 长==宽时,手动break
        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;
            }
        }
        
        int ans = count;
        System.out.print(ans);
    }
}

__04__

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

public class pb04 {
    //思路:已知循环结束条件,不知道具体循环次数,用while
    //计算获得的钱,计算累加钱,计算天数,达到条件时break
    public static void main(String[] args) {
        int count = 0;
        int pay = 1;
        int total = 0;
        
        while(true) {
            total += pay;
            count ++;
            if (total >= 108) {
                break;
            }
            pay += 2;
        }
        System.out.print(count);
    }
}

__05__

package Day01_for;
//5只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。
//第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。
//第2只猴子醒来,重新把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。
//第3只猴子醒来,重新把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。
//第4只猴子醒来,重新把香蕉均分成5堆,还剩下4个,就吃掉并把自己的一份藏起来继续睡觉。
//第5只猴子醒来,重新把香蕉均分成5堆,哈哈,正好不剩!
//
//请计算一开始最少有多少个香蕉。
//
//需要提交的是一个整数,不要填写任何多余的内容

public class pb05 {
    public static void main(String[] args) {
        //思路???
        //思路:不知到香蕉的个数,设为n个(相当于不知道循环的次数,香蕉个数只能一个一个往上加,
//        再观察是否符合break条件),用while循环。满足条件时结束:
        //暴力!!一筹莫展的时候,把公式全部写出来!
        // n % 5 = 1    a = (n-1)/5*4
        // a % 5 = 2    b = (a-2)/5*4
        // b % 5 = 3    c = (b-3)/5*4
        // c % 5 = 4    d = (c-4)/5*4
        // d % 5 = 0    d > 0
        int n = 0;
        int ans = 0;
        while(true) {
            if(n % 5 == 1) {
                int a = (n-1)/5*4;
                if(a % 5 == 2) {
                    int b = (a - 2)/5*4;
                    if(b % 5 == 3) {
                        int c = (b - 3)/5*4;
                        if(c % 5 == 4) {
                            int d = (c - 4)/5*4;
                            if(d % 5 == 0 && d > 0) {
                                break;
                            }
                        }
                    }
                }
            }
            
            n++;
        }
        
        ans = n;
        System.out.print(ans);
        
    }
}

__06__

package Day01_for;

import java.util.HashSet;

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

public class pb06 {
    public static void main(String[] args) {
        //思路??
        //利用set集合的唯一性,去除重复的子串
        //aaab从第一个下标开始截取:a aa aaa aaab
        //从第二个下标开始:a aa aab
        //......
        
        //截取字符串的方法:subString(i,j):截取子串
        String str = "0100110001010001";
        HashSet<Object> set = new HashSet<>();    //去重
        //题目问有多少个不同的非空子串,也就是求set的大小(集合只有大小,没有长度;这里和数组进行区分)
        //第一层for,控制从第几个下标开始截取
        for(int i = 0;i < str.length();i ++) {
            for(int j = i;j < str.length();j ++) {
                String temp = str.substring(i, j+1);
                set.add(temp);
            }
        }
        System.out.print(set.size());
        
    }
}

__07__

package Day01_for;

import java.util.ArrayList;

//  我们知道第一个质数是2,第二个质数是3,第三个质数是5。。。。。。
//    请你计算第2023个质数?

public class pb07 {
    //思路??
    //思路:我们可以先去求质数,然后把求到的质数放到一个list里面。去除下标为2022的,就是第2023个质数。
    public static void main(String[] args) {
        //利用list的有序性,下标是按顺序来的,题目要求第2023个质数,那么下标就取2022的那个数
        ArrayList<Object> list = new ArrayList<>();
        for(int i = 2;i <= 20000;i ++) {
            int a = 0;
            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));
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只轩少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值