写在前面:
题源:
写这篇主要是复习的时候好复习,只记了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
思路:斜着看:
第i行 min max 第j个对角线元素值为x 1 1 1 第1个对角线元素值为1 2 3 2 3 4 6 第2个对角线元素值为5 4 10 7 ... ... ... 所以说要想求出第20个对角元素则需算出第1+2*(20-1)=39行的元素都是什么;再由上表观察可知,下一行a的最大值都是上一行b的最大值加上了该行a的行号,写个循环就可以求出第20行的最大值,最大值减去38就是最小值了(最大值最小值相差行号-1)。
F:成绩分析
做题链接:蓝桥杯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:回文日期
做题链接:蓝桥杯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类型的不停转换。