输出一行,包含两个整数a和b(a和b均为32位整数)和一个运算符,运算符为“+”,“-”,“*”,"\"中的一个。(数据保证不会出现除0的情况)
输出一个整数,为上述表达式计算出的结果。
2 * 4
8
5 / 4
1
3 + 23
26
时间复杂度,额外空间复杂度
。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String expression = br.readLine();
String[] params = expression.split(" ");
int x = Integer.parseInt(params[0]), y = Integer.parseInt(params[2]);
String operator = params[1];
if(operator.indexOf("+") > -1){
System.out.println(add(x, y));
}else if(operator.indexOf("-") > -1){
System.out.println(subtract(x, y));
}else if(operator.indexOf("*") > -1){
System.out.println(multiply(x, y));
}else{
System.out.println(divide(x, y));
}
}
private static int add(int sum, int carry) {
if(carry == 0) return sum; // 进位为0,直接返回num
// 异或为无进位和,
return add(sum ^ carry, (sum & carry) << 1);
}
private static int subtract(int x, int y) {
return add(x, add(~y, 1));
}
private static int multiply(int x, int y) {
int res = 0;
while(y != 0){
if((y & 1) != 0) res = add(res, x); // 看y的最后一位是否为1
x <<= 1;
y >>>= 1; // y右移
}
return res;
}
private static int divide(int a, int b) {
// 先把两个数转成正数
int x = a < 0? add(~a, 1): a;
int y = b < 0? add(~b, 1): b;
int res = 0;
for(int i = 31; i >= 0; i--){
if((x >> i) >= y) {
res |= (1 << i); // 将res从右往左的第i位标记为1
x = subtract(x, y << i); // x减去y向左移i位的结果
}
}
// 同号直接返回结果,异号返回相反数
return ((a <= 0 && b <= 0) || (a >= 0 && b >= 0))? res: add(~res, 1);
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String operator = scanner.next();
int m = scanner.nextInt();
int res = 0;
switch(operator){
case "+":
res = add(n,m);
break;
case "-":
res = minus(n,m);
break;
case "*":
res = multi(n,m);
break;
case "/":
res = div(n,m);
break;
}
System.out.print(res);
}
public static int add(int a,int b){
int carry = (a&b) << 1;
int noCarrySum = a ^ b;
int sum = noCarrySum;
while(carry != 0){
sum = noCarrySum ^ carry;
carry = (noCarrySum & carry) << 1;
noCarrySum = sum;
}
return sum;
}
public static int minus(int a,int b){
return add(a,add(~b,1));
}
public static int multi(int a,int b){
int res = 0;
while(b!=0){
if((b & 1) != 0){
res = add(res,a);
}
b >>= 1;
a <<= 1;
}
return res;
}
public static int div(int a,int b){
return (a/b);
}
}