蓝桥杯第十一届省赛JavaA组之既约分数和回文日期

在这里插入图片描述
首先,我想到辗转相除法,因为我的脑海里记住的是传入函数的a, b,a一定要>b,所以加入了判断,后来看别人的,居然不用判断???

随便举个例子测试一下就知道了:a= 4,b=5
gcb(4,5)——>gcb(5,4%5)——>gcb(4,5%4)——>gcb( 1, 4%1)
通过观察我们知道,如果传入的a<b,在递归的过程中,会自动转换为较大数比较小数的,所以不用比较拉!

还有一个细节的地方:最大公约数为1的两个数,也就是互质数!!

…互质数的判断

在这里插入图片描述
千万不要漏掉1 / 1 =1 这一个,不然出错了就没分,太可惜了!!
加油呀!!一定要想清楚,突破自己固有的思维局限,有的时候不要被自己原有的知识所牵制。


public class 既约分数 {
	public static void main(String[] args) {
		int count = 0;
		for (int i = 1; i <= 2020; i++) {
			for (int j = 1; j <= 2020; j++) {
				if (gcb(i, j) == 1) {
					count++;
				}
			}
		}
		System.out.println(count);
	}

	public static int gcb(int a, int b) {
		if (b == 0) {
			return a;
		}
		return gcb(b, a % b);
	}
}

在这里插入图片描述
确认过头发,不是我能做的起的题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写了将近两个小时
在这里插入图片描述

反思

  1. 为什么每次读题都没有完全理解呢?
  2. 为什么我每次做题都是想当然,直接就开始敲代码呢???
  3. 为什么每次我就觉得能过样例,就等于能过所有的测试用例呢?
  4. 为什么我总是学不会自己想测试用例呢?不会想到特殊的情况呢?
  5. 写完代码不检查代码,不亲自debug一次,也不亲自在脑海里跑一次!
  6. 不写注释

存在即合理,我太菜了!

解决方案:

  1. 读完题以后画出思维导图或者流程图!
  2. 理清楚思维导图或流程图的执行顺序、如何调用、如何用变量表示?
  3. 每次多想十组测试用例,培养逻辑思维;
  4. 考虑是否有特殊情况!进行健壮性判断。
  5. 亲自在脑海里跑代码;
  6. 写注释有利于发现问题,理顺思路

在这里插入图片描述

import java.util.Scanner;

public class 回文日期 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		scanner.close();
		// 求下一个回文日期
		int add = 10000000;
		for (int i = n + 1; i < n + add; i++) {
			if (isString(i + "") && judgeValid(i + "")) {
				System.out.println(i);
				break;
			}
		}

		for (int i = n + 1; i < n + add; i++) {
			if (isAB(i + "") && judgeValid(i + "")) {
				System.out.println(i);
				break;
			}
		}
	}

	public static boolean isString(String str) {
		char[] cs = str.toCharArray();
		int len = cs.length;
		for (int i = 0; i < len / 2; i++) {
			if (cs[i] != cs[len - i - 1]) {
				return false;
			}
		}
		return true;
	}

	public static boolean isAB(String str) {
		char[] cs = str.toCharArray();
		if ((cs[0] == cs[2] && cs[0] == cs[5] && cs[0] == cs[7])
				&& (cs[1] == cs[3] && cs[1] == cs[4] && cs[1] == cs[6])) {
			return true;
		}
		return false;
	}

	public static boolean judgeValid(String string) {
		int year = Integer.valueOf(string.substring(0, 4));// 当前年份
		String month = string.substring(4, 6);// 当前月份
		boolean flag = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? true : false;
		int judgeMonth = Integer.valueOf(month);
		int judgeDay = Integer.valueOf(string.substring(6, 8));
		if (judgeMonth < 1 || judgeMonth > 12) {// 不合法。用||不是&&!!!你搞错了!气死人
			return false;
		}
		return DaysOfAMonth(month, flag, judgeDay);// 月份合法且天数也合法则都为true,否则为false
	}

	public static boolean DaysOfAMonth(String month, boolean flag, int judgeDay) {
		int day = 0;
		switch (month) {
		case "01":
		case "03":
		case "05":
		case "07":
		case "08":
		case "10":
		case "12":
			day = 31;
			break;
		case "04":
		case "06":
		case "09":
		case "11":
			day = 30;
			break;
		default:
			if (flag) {
				day = 29;
			} else {
				day = 28;
			}
			break;
		}
		if (judgeDay > day || judgeDay < 0) {// 如果求得的字符串天数>该月最大天数或者<0则说明不合法!!!用||不是&&!!!你搞错了!气死人
			return false;
		}
		return true;
	}
}

总结

发现问题、解决问题,归纳总结,熟稔于心,不要过于浮躁,要一步一步,脚踏实地!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值