2013年蓝桥杯省赛JavaB题解

真题下载地址

需要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);
	}
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值