首先,我想到辗转相除法,因为我的脑海里记住的是传入函数的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);
}
}
确认过头发,不是我能做的起的题
写了将近两个小时
反思
- 为什么每次读题都没有完全理解呢?
- 为什么我每次做题都是想当然,直接就开始敲代码呢???
- 为什么每次我就觉得能过样例,就等于能过所有的测试用例呢?
- 为什么我总是学不会自己想测试用例呢?不会想到特殊的情况呢?
- 写完代码不检查代码,不亲自debug一次,也不亲自在脑海里跑一次!
- 不写注释
存在即合理,我太菜了!
解决方案:
- 读完题以后画出思维导图或者流程图!
- 理清楚思维导图或流程图的执行顺序、如何调用、如何用变量表示?
- 每次多想十组测试用例,培养逻辑思维;
- 考虑是否有特殊情况!进行健壮性判断。
- 亲自在脑海里跑代码;
- 写注释有利于发现问题,理顺思路
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;
}
}
总结
发现问题、解决问题,归纳总结,熟稔于心,不要过于浮躁,要一步一步,脚踏实地!