刷题第一天

一、简单做法

1、两整数之和

  int getSum(int a, int b) {
        return a+b;
    }

2、不用加号的加法

int add(int a, int b) {
        return a+b;
    }

3、不用加减乘除做加法

int add(int a, int b) {
        return a+b;
    }

4、递归乘法

 int multiply(int A, int B) {
        return A*B;
    }

5、 两数相除

 int divide(int dividend, int divisor) {
        if(dividend==-2147483648&&divisor==-1){
            return 2147483647;
        }
        return dividend/divisor;
    }

6、Pow(x,n)

double myPow(double x, int n) {
        return pow(x,n);
    }

7、x的平方根

int mySqrt(int x) {
        return sqrt(x);
    }

8、最大数值

int maximum(int a, int b) {
        return a>b?a:b;
    }

 9、反转两次的数字

 bool isSameAfterReversals(int num) {
        return num==0||num%10;
    }

二、进阶做法

位运算符:

        <<:空位补0,被移除的高位丢弃

        >>:被移位的二进制最高位是0,右移后空位补0;最高位是1,最高位补1

        &:任何二进制位和0进行&运算,结果都是0;和1进行&运算结果都是原值

        |:任何二进制位和0进行|运算,结果都是原值;和1进行|运算结果都是1

        ~:0的为1,1的为0

        ^:相同为0,相异为1

不用加减乘除做加法

int add(int a, int b) {
        while(b!=0){// 当进位为 0 时跳出
            unsigned int c=(unsigned int)(a&b)<<1;// c = 进位
            a=a^b;// a = 非进位和
            b=c;// b = 进位
        }
        return a;
    }

递归乘法 

a*2=a<<1;b/2=b>>1;

 int multiply(int A, int B) {
       if(B==1){return A;}
       if(B==0){return 0;}
       if(B&1){
           return multiply(A<<1,B>>1)+A;
       }
       else {
           return multiply(A<<1,B>>1);
    }
    }

 两数相除

int divide(int dividend, int divisor) {
        int sign=((dividend^divisor)>>31&0x1==1)?-1:1;
        long result=0;
        long dividend_long=abs((long)dividend);
        long divisor_long=abs((long)divisor);
        while(dividend_long>=divisor_long){
            long i=1;
            long tmp=divisor_long;
            while(dividend_long>=tmp){
                dividend_long-=tmp;
                result+=i;
                i=i<<1;
                tmp=tmp<<1;
            }
        }
        result*=sign;
        if(result>INT_MAX||result<INT_MIN){
            return INT_MAX;
        }
        return (int)result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值