写在前面:

题源:

(1条消息) 2020第十一届蓝桥杯第二场省赛JAVA A组真题解析(带源码及解析)_王跃坤的博客

        写这篇主要是复习的时候好复习,只记了ABCFG这五题,如果想看所有题目的可以直接点击上面别人大佬的链接,就不用点击关注我了(设个关注仅仅只是我很菜,还是不要出来乱晃了,当然有大佬想看我的题解欢迎不吝赐教)

A:门牌制作

第八届届蓝桥杯省赛javac组分值 蓝桥杯大赛java_蓝桥杯

public class Main {
	public static void main(String[] args) {
		Integer n;
		String s;
		int ans=0;
		for (int i = 1; i < 2021; i++) {
			n=i;
			s=n.toString();
			for (int j = 0; j < s.length(); j++) {
				if (s.charAt(j)=='2') {
					ans++;	
				}
			}
		}
		System.out.println(ans);
	}
}

答案:624

思路:签到题...


B:既约分数

第八届届蓝桥杯省赛javac组分值 蓝桥杯大赛java_System_02

public class Main {
	public static void main(String[] args) {
		int ans=0,tmp;
		for (int i = 1; i < 2021; i++) {
			for (int j = i+1; j < 2021; j++) {
				tmp=gcd(i,j);
				if(tmp==1) ans++;
			}
		}
		System.out.println(ans*2+1);  //还有1/1的情况
		
	}
	
	private static int gcd(int i, int j) {
		int yu=j%i;
		if(yu==0) {return i;}
		else {return gcd(yu,i );}
		}

}

答案:2481215

思路:其实就是求最大公约数,看它是不是等于1;另所求的分数是对称的,所以可以求一般然后*2,但是最后记得还有1/1的情况。


C:蛇形填数

第八届届蓝桥杯省赛javac组分值 蓝桥杯大赛java_蓝桥杯_03

public class Main {
	public static void main(String[] args) {
		int max=1,min;
		for (int i = 2; i <=39; i++) {
			max=i+max;
		}
		min=max-38;
		System.out.println(max);
		System.out.println(min);
		System.out.println((min+max)/2);	
	}	
}

答案:761

思路:斜着看:

第八届届蓝桥杯省赛javac组分值 蓝桥杯大赛java_第八届届蓝桥杯省赛javac组分值_04

所以说要想求出第20个对角元素则需算出第1+2*(20-1)=39行的元素都是什么;再由上表观察可知,下一行a的最大值都是上一行b的最大值加上了该行a的行号,写个循环就可以求出第20行的最大值,最大值减去38就是最小值了(最大值最小值相差行号-1)。

 F:成绩分析

第八届届蓝桥杯省赛javac组分值 蓝桥杯大赛java_java_05

 

第八届届蓝桥杯省赛javac组分值 蓝桥杯大赛java_蓝桥杯_06

 做题链接:蓝桥杯2020年第十一届省赛真题-成绩分析 - C语言网 (dotcpp.com)

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		int n,tmp,max=-1,min=101;
		double sum=0;
		Scanner sc= new Scanner(System.in);
		n=sc.nextInt();
		for (int i = 0; i < n; i++) {
			tmp=sc.nextInt();
			sum+=tmp;
			if(tmp>max) max=tmp;
			if(tmp<min) min=tmp;
		}
		sum=sum/n;
		System.out.println(max);
		System.out.println(min);
		/*BigDecimal b = new BigDecimal(sum);
		b=b.setScale(2,BigDecimal.ROUND_HALF_UP);
		sum=b.doubleValue();
		System.out.println(sum);*/
		String format = new DecimalFormat("#.00").format(sum);
		System.out.println(format);
	}
	
}

思路:没啥好说,这题考点应该就是四舍五入,精确到好多位。

G:回文日期

第八届届蓝桥杯省赛javac组分值 蓝桥杯大赛java_蓝桥杯_07

 做题链接:蓝桥杯2020年第十一届省赛真题-回文日期 - C语言网 (dotcpp.com)

import java.util.ArrayList;
import java.util.Scanner;

public class Main{
public static void main(String[] args) {
	String s;
	Scanner sc=new Scanner(System.in);
	s=sc.next();
	
	int year=Integer.valueOf(s.substring(0,4));  //获取输入的年
	String tmp;
	int flagni=0,flagab=0,m,d,mon,day;
	mon=Integer.valueOf(s.substring(4,6));  //输入的月
	day=Integer.valueOf(s.substring(s.length()-2));  //输入的日
	
	//大坑点!!!
	tmp=nixu(year);
	m=Integer.valueOf(tmp.substring(0,2));  //当前日期翻转后的月
	d=Integer.valueOf(tmp.substring(2,4));  //当前日期翻转后的日
	
	//判断输入的年翻转后是否符合回文日期
	if(judge(tmp,year)==true) {
		if(m>=mon&&d>day) {
			print(year);
			System.out.println();
			flagni=1;
		}
	}
	//判断输入的年翻转后是否符合ABABBABA
	if(ab(year)==true) {
		if(m>=mon&&d>day) {
			print(year);
			flagab=1;
		}
	}
	
	if(flagni==0) {
	//year++,循环判断回文数字
	while(true) {
		year++;
		tmp=nixu(year);
		if(judge(tmp,year)==true) {
			print(year);	
			break;
		}
	}
	System.out.println();}
	
	//year++,循环判断ABABBABA
	if(flagab==0) {
	year=Integer.valueOf(s.substring(0,4));
	while(true) {
		year++;
		if(ab(year)==true) {
			tmp=nixu(year);
			if(judge(tmp,year)==true) {
				print(year);	
				break;
			}
		}
	}}
}

//打印
static void print(int year) {
	System.out.print(year);
	
	String tmp,m,d;
	
	tmp=nixu(year);
	m=tmp.substring(0,2);
	d=tmp.substring(2,4);
	
	if(m.length()==1) {
		m='0'+m;
	}
	System.out.print(m);
	if(d.length()==1) {
		d='0'+d;
	}
	System.out.print(d);
}

//判断逆序后的数字是否符合月日的要求
static boolean judge(String tmp,int year) {
	int mon,day;
	mon=Integer.valueOf(tmp.substring(0,2));
	if(mon>12||mon<=0) return false;
	day=Integer.valueOf(tmp.substring(2,4));
	if(day>31||day<=0) return false;
	/*if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12) {
		if(day>31) return false;
	}*/ //可以不要,上一步已经判断过了
	if(mon==4||mon==6||mon==9||mon==11) {
		if(day>30) return false;
	}
	if(mon==2) {
		if(((year%4==0)&&(year%100!=0))||year%400==0) {
			if(day>29) return false;
		}
		else {
			if(day>28) return false;
		}
	}
	return true;
}

//判断ABAB翻转后的月日是否符合规范
static boolean ab(int year) {
	String tmpString,suba,subb;
	tmpString=Integer.toString(year);
	suba=tmpString.substring(0,2);
	subb=tmpString.substring(tmpString.length()-2);
	if(suba.equals(subb)) {
		return true;
	}
	return false;
}

//逆序
static String nixu(int year)
	{
		String s=Integer.toString(year);
		StringBuffer stringBuffer=new StringBuffer(s);
		s=stringBuffer.reverse().toString();
		return s;
	}
}

思路:

        由题目已知,求往后的日期,所以重点在年上,由给出的年,往后+1+1+1,看该年份格式转换后的时间是否符合月日规范(注意闰年),符合就是答案。

        但是注意,有一个坑点,坑了我好久,就是输入的年份也需要判断,比如输入20200201,那么结果应该是20200202和21211212。如果输入20200330,结果是20211202和21211212。

        另,别看代码长,实际上就是int和String类型的不停转换。