写在前面:
题源:
(1条消息) 2020第十一届蓝桥杯第二场省赛JAVA A组真题解析(带源码及解析)_王跃坤的博客
写这篇主要是复习的时候好复习,只记了ABCFG这五题,如果想看所有题目的可以直接点击上面别人大佬的链接,就不用点击关注我了(设个关注仅仅只是我很菜,还是不要出来乱晃了,当然有大佬想看我的题解欢迎不吝赐教)
A:门牌制作
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:既约分数
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:蛇形填数
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
思路:斜着看:
所以说要想求出第20个对角元素则需算出第1+2*(20-1)=39行的元素都是什么;再由上表观察可知,下一行a的最大值都是上一行b的最大值加上了该行a的行号,写个循环就可以求出第20行的最大值,最大值减去38就是最小值了(最大值最小值相差行号-1)。
F:成绩分析
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:回文日期
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类型的不停转换。