A-莲子的软件工程学
题目预览
题目背景(推荐阅读 题目预览)
如果遇到提交失败,请多次刷新,多次提交,会有成功几率
在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了。
对于一名理科生来说,各种软件在学习和研究中是非常重要的。为了尽快恢复她电脑上的软件的正常使用,她需要尽快地重新编写这么一些函数。
题目描述
具体而言,给定两个整数 a , b a,b a,b,保证 b ≠ 0 b\neq 0 b=0。莲子要实现这样一个函数 fun ( a , b ) \operatorname{fun}(a,b) fun(a,b) 来将 b b b 的符号转移到 a a a 上。
具体而言, fun ( a , b ) = sgn ( b ) × ∣ a ∣ \operatorname{fun}(a,b)=\operatorname{sgn}(b)\times |a| fun(a,b)=sgn(b)×∣a∣。其中, sgn ( b ) = { 1 b > 0 − 1 b < 0 \operatorname{sgn}(b)=\begin{cases}1&b>0\\-1&b<0\end{cases} sgn(b)={1−1b>0b<0
换而言之:
- 如果 b b b 是正数,那么 fun ( a , b ) = + ∣ a ∣ = ∣ a ∣ \operatorname{fun}(a,b)=+|a|=|a| fun(a,b)=+∣a∣=∣a∣;
- 如果 b b b 是负数,那么 fun ( a , b ) = − ∣ a ∣ \operatorname{fun}(a,b)=-|a| fun(a,b)=−∣a∣。
如果使用一个三维坐标系描述 fun ( a , b ) \operatorname{fun}(a,b) fun(a,b),则应当如下图所示:
你只需输出 fun ( a , b ) \operatorname{fun}(a,b) fun(a,b) 的值。
输入格式
- 共一行两个整数 a , b a,b a,b。
输出格式
- 共一行一个整数 fun ( a , b ) \operatorname{fun}(a,b) fun(a,b) 的值。
样例 #1
样例输入 #1
-1 2
样例输出 #1
1
样例 #2
样例输入 #2
0 -4
样例输出 #2
0
样例 #3
样例输入 #3
-12345 -54321
样例输出 #3
-12345
提示
对于全部数据,保证 a , b a,b a,b 在 32 32 32 位有符号整型范围内,并且 b ≠ 0 b \neq 0 b=0。
题解
签到题。首先用 if 语句判断 b 的符号,然后加在 a 的绝对值上即可。
- 出题的灵感?在库函数里有个处理浮点数用的函数 copysign(a,b) 就是干这个活的。当然浮点数要复杂得多,比如会有 Infinity、NaN 这类奇怪的玩意,以及还有 -0−0 这种特殊的东西。当然本题限定在了整数。
- 题目的坑点?注意到,32 位有符号整型的范围是 -2^{31}\sim (2^{31}-1)−231∼(231−1),那么当 -2^{31}−231 取绝对值时就会超过 int 的范围。可以特判/使用范围更大的数据类型。
时间复杂度为 O(1)。
参考代码:
-
版本1:
#include<bits/stdc++.h> #define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i) #define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i) using namespace std; typedef long long i64; const int INF = 2147483647; int main(){ int a, b; cin >> a >> b; cout << fixed << setprecision(0) << copysignl(a, b) + 1e-9 << endl; return 0; }
-
版本2:
#include<bits/stdc++.h> #define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i) #define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i) using namespace std; typedef long long i64; const int INF = 2147483647; int main(){ i64 a, b; cin >> a >> b; cout << (b < 0 ? -llabs(a) : llabs(a)); return 0; }
-
版本3:
#include <bits/stdc++.h> using namespace std; int main() { int a,b; cin >> a >> b; if (b>0 && a==INT_MIN) cout << 2147483648ll << endl; else { a=abs(a); if (b<0) a*=-1; cout << a << endl; } return 0; }
-
版本4:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); long a = scanner.nextLong(), b = scanner.nextLong(); System.out.println((Math.abs(a) * (b > 0 ? 1 : -1))); } }