1.371. 两整数之和
/**给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。 */
class Solution {
public int getSum(int a, int b) {
return a + b;
}
}
2.面试题 17.01. 不用加号的加法
/**设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。 */
class Solution {
//异或计算
public int add(int a, int b) {
int sum = 0, temp = 0;
while(b!= 0){
sum = a ^ b;
temp = (a & b) << 1;//进位
a = sum ;//此为未进位部分
b = temp;//进位部分保存,再次计算
}
return a;//得到加法的结果
}
}
3.剑指 Offer 65. 不用加减乘除做加法
/**写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。 */
class Solution {
public int add(int a, int b) {
return a + b;
}
}
4.面试题 08.05. 递归乘法
/**递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些*/
class Solution {
public int multiply(int A, int B) {
if(B == 0 || A == 0){
return 0;
}
if(A > B){
//A > B ,B减少
return A + multiply(B - 1, A);//将乘转换为加上自己的倍数即可
}
return B + multiply(B, A - 1);
}
}
5.69. Sqrt(x)
/**
1.给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
2.由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
*/
class Solution {
//二分法
public int mySqrt(int x) {
int left = 0 , right = x;
if(right == 1 || right == 0){
return right;
}
while (right - left > 1){
int mid = (right - left) / 2 + left;
if(x / mid < mid){
//保留整数
right = mid;
}else {
left = mid;
}
}
return left;
}
}
6.50. Pow(x, n)
/**实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 */
class Solution {
//暴力
public double myPow(double x, int n) {
/*long y = n;
if(y < 0){
x = 1 / x;
y = -y;
}
double res = 1;
for(long i = 0; i < y ; i++){
res = res*x;
}
return res;*/
long N = n;
return n >= 0 ? check (x,N) : 1 / check(x,-N);
}
public double check(double x, long N){
if(N == 0){
return 1.0;
}
double res = check(x, N>>1);
//左操作数按位右移,移动右操作数指定的位数
if(N % 2 == 1){
return res* res * x;//平方数不够的可以额外乘x
}else{
return res *res;
}
}
}