真题下载地址
需要2013年蓝桥杯JavaB组真题的可以在评论下留一下邮箱
目录
一、标题: 世纪末的星期
- 使用GregorianCalendar类进行枚举判断
package _2013JavaB组_60_100; import java.util.Calendar; import java.util.GregorianCalendar; public class P1 { public static void main(String[] args) { int year = 20; int month = 11; int day = 31; for (; year < 100; year++) { int temp = year*100+99; GregorianCalendar calendar = new GregorianCalendar(temp, month, day); //System.out.println(calendar.get(Calendar.DAY_OF_WEEK)); if(calendar.get(Calendar.DAY_OF_WEEK)==1) { System.out.println(temp); break; } } } }
answer:2299
二、标题: 马虎的算式
- 暴力枚举+判断
package _2013JavaB组_60_100; public class P2 { public static void main(String[] args) { int count = 0; for (int a = 1; a < 10; a++) { for (int b = 1; b < 10; b++) { for (int c = 1; c < 10; c++) { for (int d = 1; d < 10; d++) { for (int e = 1; e < 10; e++) { if(a!=b && a!=c && a!=d && a!=e && b!=c && b!=d && b!=e && c!=d && c!=e && d!=e) { int num1 = Integer.valueOf(a+""+b); int num2 = Integer.valueOf(c+""+d+""+e); int num3 = Integer.valueOf(a+""+d+""+b); int num4 = Integer.valueOf(c+""+e); if(num1*num2==num3*num4) { //System.out.println(num1+"*"+num2+"="+num3+"*"+num4); count++; } } } } } } } System.out.println(count); } }
answer:142
三、标题: 振兴中华
- dfs
package _2013JavaB组_60_100; public class P3 { public static int count = 0; public static void dfs(char[][] gz,int i,int j) { if(i>=gz.length || j>=gz[0].length) { return; } //横着搜 dfs(gz, i, j+1); //竖着搜 dfs(gz, i+1, j); if(gz[i][j]=='h') { count++; return; } } public static void main(String[] args) { char[][] gz = new char[][] { {'a','b','c','d','e'}, {'b','c','d','e','f'}, {'c','d','e','f','g'}, {'d','e','f','g','h'} }; dfs(gz, 0, 0); System.out.println(count); } }
answer:35
四、标题: 黄金连分数
- 斐波那契数列
- 大数类的使用
- (坑点)需要让这个数趋于稳定才行
package _2013JavaB组_60_100; import java.math.BigDecimal; import java.math.BigInteger; public class 补_P4 { /*坑点: 1.使用long存不下斐波那契数,要使用大数 2.double只能存小数点后16位,如果想要存小数点后100位还得使用BigDecimal 3.这个数还要趋于稳定 */ public static void main(String[] args) { BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.ONE; for (int i = 0; i < 400; i++) { BigInteger temp = b; b = a.add(b); a = temp; } BigDecimal bigDecimalA = new BigDecimal(a); //System.out.println(bigDecimalA+"==="+a); BigDecimal bigDecimalB = new BigDecimal(b); //System.out.println(bigDecimalB+"==="+b); System.out.println(bigDecimalA.divide(bigDecimalB,100,BigDecimal.ROUND_HALF_UP)); } }
answer:0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375
五、标题:有理数类
- 面向对象
answer:new Rational(ra*x.rb+x.ra*rb, rb*x.rb)
六、标题:三部排序
- 快速排序分区思维(三指针分区)
answer:p++
七、标题:错误票据
- 输入的处理
- 排序+迭代判断
AcCode:
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); List<Integer> list = new ArrayList<Integer>(); int N = in.nextInt(); //in.nextLine(); while(N!=0) { String k = in.next(); String s = in.nextLine(); String[] nums = s.split("\\s"); for (int i = 0; i < nums.length; i++) { if(!nums[i].equals("") && !nums[i].equals(" ")) { list.add(Integer.valueOf(nums[i])); } } if(!k.equals("") && !k.equals(" ")) { list.add(Integer.valueOf(k)); } N--; } Collections.sort(list); int m = Integer.MAX_VALUE;//表示断号 int n = Integer.MAX_VALUE;//表示重号 for (int i = 1; i < list.size(); i++) { if((list.get(i)-list.get(i-1))==0) { n = list.get(i); } if((list.get(i)-list.get(i-1))==2) { m = list.get(i)-1; } } System.out.println(m+" "+n); } }
八、标题:幸运数
- 模拟
- 其实我觉得暴力的模拟是过不了的,所以我打了个表...发现代码长度超限,后面看了一下其他人的题解就是一个暴力的模拟过了,其实还是数据水的原因
AcCode:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int m = in.nextInt(); int n = in.nextInt(); List<Integer> list = new ArrayList<Integer>(); list.add(0); for (int i = 1; i < n; i++) { if(i%2!=0) { list.add(i); } } // List<Integer> temp = new ArrayList<Integer>(); // temp = list; for (int i = 2; i < list.size(); i++) { int num = list.get(i); int j = 1; for (; num*j < list.size(); j++) { list.set(num*j, -1); } for (int k = 0; k < list.size(); k++) { if(list.get(k)==-1) { list.remove(k); } } // list = temp; } int count = 0; for (int i = 0; i < list.size(); i++) { if(list.get(i)>m && list.get(i)<n) { count++; } if(list.get(i)>=n) { break; } } System.out.println(count); } }
九、带分数
- 全排列+枚举+剪枝
AcCode:
import java.util.Scanner; public class Main{ public static int count = 0; public static int tempN; public static void perm(int[] arr, int begin, int end) { // 设置递归的出口,即当需要全排列的范围只有一个元素,则全排结束,此数组为全排列 if (begin == end) { // StringBuffer buffer = new StringBuffer(); // for (int i = 0; i <= end; i++) { // buffer.append(arr[i]); // // System.out.print(arr[i] + " "); // } // System.out.println(buffer); for (int i = 0; i <= 6; i++) { int num1 = toInt(arr, 0, i+1); //剪枝 if (num1 >= tempN) continue; for (int j = i + 1; j <= 7; j++) { // for (int j2 = j+1; j2 < arr.length; j2++) { int num2 = toInt(arr, i+1, j+1); int num3 = toInt(arr, j+1, arr.length); //System.out.println(num1+" "+num2+" "+num3); if (num2%num3==0 && (num1 + num2 / num3) == tempN) { // map.put(num1+" "+num2+" "+num3, 1); // System.out.println("==="+buffer); count++; } // } } } // System.out.println(); return; } else { // for循环将begin~end中的每一个数放到begin位置中去,并实现全排列 for (int j = begin; j <= end; j++) { swap(arr, begin, j); // for循环将begin~end中的每一个数放到begin位置中去 perm(arr, begin + 1, end); // 假设begin位置确定,那么对begin+1~end中的数组进行全排列 swap(arr, begin, j); // 换过去后再将数组还原 } } } public static int toInt(int[] arr,int beginIndex,int endIndex) { int res = 0; for (int i = beginIndex; i < endIndex; i++) { res = res*10+arr[i]; } return res; } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); tempN = N; int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; perm(arr, 0, arr.length - 1); System.out.println(count); } }
十、 标题:连号区间数
- 暴力枚举
AcCode:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int[] nums = new int[N]; for (int i = 0; i < nums.length; i++) { nums[i] = in.nextInt(); } int count = 0; for (int i = 0; i < nums.length; i++) { int min = nums[i]; int max = nums[i]; for (int j = i; j < nums.length; j++) { if(nums[j]>max) { max = nums[j]; } if(nums[j]<min) { min = nums[j]; } if((max-min+1)==(j-i+1)) { count++; } } } System.out.println(count); } }