蓝桥杯概况
一共十道题,前五题填空题,后五题代码题(需要提交代码)
难度:从易到难
获奖人数:一等奖10%,二等奖20%,三等奖30%
蓝桥杯通常在前三道题目中涉及到循环知识点
for循环:一般能在题目里找到 循环次数
while循环:只知道循环条件,不知道循环次数
在考查循环时,还会涉及到集合、字符串等知识点的应用。
例如:1. 对字符串考察常见函数。字符串转字符数组,判断结尾等。
2.集合一般考察特性:list:有序可重复。set:无序不可重复。map:key-value键值对
for循环和while循环
已知循环次数使用for循环
不知道循环次数,但知道循环条件,使用while循环
解题思路中需要设方程求解,需要设置未知数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));
}
}