1~4
类型转换
描述
设计一个方法,将一个小于2147483647的double类型变量以截断取整方式转化为int类型
输入描述:
随机double类型变量
输出描述:
转化后的int类型变量
示例1
输入:
12.34
输出:
12
示例2
输入:
1.88
输出:
1
内心想法:
最简单的做法应该就是一个强制转换类型了,虽然也有其他耗时又短内存又小的写法,但并不够“入门”(真的不是我不会(doge ),在此不作介绍。与此同时看到限制说“将一个小于2147483647的double类型变量”,内心一笑。
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double d = scanner.nextDouble();
System.out.println(Main.typeConversion(d));
}
public static int typeConversion(double d){
return (int)d;
}
}
收获:
其实上面代码还是加上限制输入的double变量小于2147483647比较严谨,虽然这种测试数据不加也能过(绝不是我懒)。因为进行强制类型转换的时候,目标类型的取值范围要小于源类型,而int类型的取值范围正是-2147483648 ∼ \sim ∼ 2147483647,所以这里加了句限制条件。
简单运算
描述
输入两个正整数a和b,输出这两个正整数的和,差,积,商,模(若a>b则输出a-b,a/b,a%b的值反之输出b-a,b/a,b%a的值,不考虑小数,请使用int类型)
输入描述:
两个正整数
输出描述:
它们的和,差,积,商,模。每个值之间用空格隔开
示例1
输入:
10 5
输出:
15 5 50 2 0
内心想法:
最开始的想法是用if...else
语句,但既然都想到这个了,就自然会想到之前学C++时冒泡算法中用到的创建个temp
交换a和b的思想,还有三目运算符也能替代这个if...else
的过程。
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
scanner.close();
if(a < b){
int temp = b;
b = a;
a = temp;
}
System.out.println(a+b+" "+(a-b)+" "+(a*b)+" "+(a/b)+" "+(a%b));
}
}
或
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
scanner.close();
System.out.println((a+b)+" "+(a>b?a-b:b-a)+" "+a*b+" "+(a>b?a/b:b/a)+" "+(a>b?a%b:b%a));
}
}
收获:
我们看到给出的代码中有这样一条语句:
scanner.close();
这里用到了close
方法。这个方法的作用就是关闭System.in
,为什么要关闭呢,因为System.in
在被第一次声明时会打开InputStream
,而输入流是非常占据内存的,为此我们通常为了节省内存考虑会选择调用scanner.close()
来关闭输入流,从而节省内存。如果没有关闭,那么在方法结束后,Scanner
对象虽然会进入被回收的队列中,但不是立刻回收,会造成一定的内存占据,所以至少在方法结束前应调用close
方法。
值得注意的是,System.in
在被关闭后并不能重新打开,所以如果要关闭System.in
的话一定要确保在同一方法下接下来不会再调用Scanner
来接受输入。
四舍五入
描述
定义一个int类型变量i,i为由浮点数变量d四舍五入后的整数类型,请将转换后的i进行输出
输入描述:
用户随机输入的浮点数
输出描述:
四舍五入之后的整数(小数点后一位>=5则进一,否则舍去)
示例1
输入:
14.99
输出:
15
内心想法:
第一下想到之前C++的floor(x+0.5)
,想着改成Math.floor(x+0.5)
,没想到出现了俩问题,虽然不妨碍通过。
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double d= scanner.nextDouble();
int i = (int)Math.round(d);
System.out.println(i);
}
}
收获:
上面代码可以看到并没用到前面说的Math.floor(x+0.5)
,因为四舍五入的函数都被人家封装好了(小丑.jpg),直接调用这个round
方法就可以了。另外还发现一点,这里跟C++不同,Java中将高级类型数据直接赋给低级类型数据是会出现编译错误的,在编译器中也会直接报错,要显式地进行数据类型转换。可以想象到round
方法的具体实现就是用int i = (int)(d+0.5)
这一关键语句。
交换变量值
描述
在不使用第三个变量的情况下交换两个int类型变量的值
输入描述:
a变量和b变量的值
输出描述:
交换后a变量和b变量的值,中间用空格隔开
示例1
输入:
1 2
输出:
2 1
内心想法:
确实一下子呆住了,因为习惯用临时变量了,只能想想有没有新方法,思路方向就是要么想个妙一点的数学方法,没办法就往位运算符那边走。很遗憾的是…我两边都想出来了(Doge)。
代码实现:
法一:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
a = a + b;
b = a - b;
a = a - b;
System.out.println(a+" "+b);
}
}
法二:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
a ^= b;
b ^= a;
a ^= b;
System.out.println(a+" "+b);
}
}
收获:
其实上面说的两个方法本质上都是一个方法,因为思路是一样的(虽然位运算执行会快一点),只是法二是在二进制的基础上操作。收获就是这俩算法。