(一) 空循环的妙用
在之前学习C的时候,导师是一位资深算法工程师,其对代码的精细要求使我获益匪浅。
比如:
int i = 0;
for(i = min; i >=1; i--){
if(min % i == 0 && max % i == 0){
printf("最大公约数:%d\n",i);
break;
这是一段求最大公约数的代码,可以看到,正常情况下的思路应该是架循环后内置判断再跳出循环。
大可欣赏一下空循环的做法:
int i = 0;
for (i = min; i >= 1 && (min % i != 0 || max % i != 0) ; i--) ;
printf("最大公约数:%d\n",i);
我们可以来梳理一下思路:
传统做法:
I. 从较小数开始循环判断,是否为当前两数的公约数(此时较小数便为最大公约数);
II. 若不符合,i 自减,直到1,循环结束(则二者最大公约数为1)。
空循环做法:
I. 岗哨 i 满足进入循环的要求的基础上,若两数对 i 取余不能整除,则继续循环,
II. 若能整除,则空循环结束,此时 i 所指向的数便为最大公约数。
import java.util.Scanner;
//求两个数的最小公倍数和最大公约数
public class Demo {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入较大值:");
int max = in.nextInt();
System.out.println("请输入较小值:");
int min = in.nextInt();
int i = 0;
for (i = min; i >= 1 && ((min % i != 0) || (max % i != 0)) ; i--) ;
System.out.println("最大公约数:" + i);
for (i = max;(i % min != 0) || (i % max != 0); i++);
System.out.println("最小公倍数:" + i);
}
}
放到Java中亦是如此。
相比于传统方法倾向于人解决问题的思路,架空循环便是追求编程的高度。
节省一层判断,使代码更高效简便。
(二) 字符类型提取整型
public class Demo {
public static void main(String[] args) {
char a = '6';
char b = '7';
System.out.println(a + b);
}
}
此时运行我们会得到的是:
毋庸置疑,字符6和字符7在运算时会在底层自动转换成其对应的ascii码值,且自动提升成整型来进行运算。
我们进行一次强转:
System.out.println((char) (a + b));
便会得到其对应ascii码的字符。
那该如何提取出整形呢?
我们不妨想想:
‘6’对应的ascii码值为54,那么让其减去ascii码值为48的‘0’,不就可以得到整型6了么。
public class Demo {
public static void main(String[] args) {
char a = '6';
char b = '7';
System.out.println(a - '0' + b - '0');
}
}
显然是可以的,若是需要用到这个数,只需将它赋给一个整型变量即可。