之前刷题明明运行都没有错,但是一提交就报错。我百思不得其解,让ai帮我改,明明跟我一模一样,甚至改的更复杂了,但是答案居然是对的。 最大关键数查找
小M拿到了一些整数,他定义“关键数”为至少能被其一位数字整除的数。换句话说,如果一个数的某一位数字可以整除该数本身,则称该数为关键数。
现在,给定一个整数 N,小M想从 1 到 N 的所有整数中找到一个最大的关键数,并返回它。
例如,当 N 为 499 时,最大的关键数是 496,因为 496 可以被其十位数字 4 整除。
这是一开始的代码
这是ai帮我改过的代码
运行的三个案例都是对的,但是当我满怀信心提交代码时,问题出现了。
报错了,我还看不懂这是什么。虽然ai给我改的面目全非,但是我们的逻辑都是一样的,都是从最大的数开始逐步递减,穷举出最大的那个关键数。但是我的代码有问题,我猜想是不是头文件的问题。但是改完发现还是不对。于是我开始了漫长的查错之路。我把我的代码跟ai写的代码一行一行替换,替换一次提交一次,直到我发现了if语句的判定一改答案就正确了
很奇怪,明明只是交换了一下左右的顺序,但是结果居然发生了变化。于是此时的我开始查&&的用法
&&
表示逻辑与的意思,即为and。当&&两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
比如 12&&23的结果就是1,12&&-1 的结果是1,123&&0的结果就是0
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException。
短路的功能,这个沉睡在记忆深处的知识点使我茅塞顿开,如果按照我一开始的写法,先进行N%digit!=0的判断,那么digit==0的时候,N除了一个0,这不报错才有鬼。交换顺序后,首先进行digit!=0的判断,将digit是0的可能给杜绝了,这样N%digit!=0就不会报错了,这个折磨了我半个小时的问题就这样解决了。这种非语法问题还是改的太少了。