Leetcode 29 两数相除 学习感悟

思路1:暴力减法,每次加1

思路2:每次除数自身相加,res自身相加,以倍数增加

//BF思路1:
class Solution {
public:
    int divide(int dividend, int divisor) {//a/b  10/3
	    int res = 0;
	    if (dividend == 0)return 0;//a为0
	    if (divisor == 1)return dividend;//b为1
	    if (divisor == -1 && dividend == INT_MIN) return INT_MAX;//b=-1,最小负数转正会溢出
	    if (divisor == -1)return -dividend;
	    if (divisor == INT_MIN) {
	    	if (dividend == INT_MIN)return 1;
		    else return 0;
    	}
	    //边界
	    bool f = false;//负数
	    if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) {
	    	f = true;
	    }
	    else {
		    f = false;
	    }
	    if (dividend == INT_MIN) {
		    if (f) {//正数
			    res++;
			    dividend -= divisor;
		    }
		    else {//负数
			    res++;
			    dividend += divisor;
	    	}
	    }
	    dividend = (dividend > 0 ? dividend : -dividend);
	    divisor = (divisor > 0 ? divisor : -divisor);
	    while (dividend >= divisor) {
	    	res++;
	    	dividend -= divisor;
	    }
	    return f ? res : -res;
    }
};
# include<iostream>
# include<vector>
# include<string>
# include<algorithm>
# include<math.h>
# include<climits>
# include<stack>
# include<queue>
using namespace std;
int divide(int dividend, int divisor) {//a/b  10/3
	int res = 0;
	if (dividend == 0)return 0;//a为0
	if (divisor == 1)return dividend;//b为1
	if (divisor == -1 && dividend == INT_MIN) return INT_MAX;//b=-1,最小负数转正会溢出
	if (divisor == -1)return -dividend;
	if (divisor == INT_MIN) {
		if (dividend == INT_MIN)return 1;
		else return 0;
	}
	//边界
	bool f = false;//负数
	if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) {
		f = true;
	}
	else {
		f = false;
	}
	if (dividend == INT_MIN) {//防止dividend最小无法转成正数
		if (f) {//正数
			res++;
			dividend -= divisor;
		}
		else {//负数
			res++;
			dividend += divisor;
		}
	}
	double dividend_;
	double divisor_;
	dividend_ = (dividend > 0 ? dividend : -dividend);
	divisor_ = (divisor > 0 ? divisor : -divisor);
	//数据预处理
	//正式计算部分
	int tpres;//res=res+tpres
	int tpdivisor= divisor_;
	int lastdivisor;
	while (dividend_ >= divisor_) {
		tpres = 1;
		while ((divisor_ + divisor_ <=INT_MAX) && dividend_ >= (divisor_ + divisor_)) {//溢出判定
			divisor_ += divisor_;
			tpres+= tpres;
		}
		res += tpres;
		dividend_ -= divisor_;
		divisor_ = tpdivisor;
	}
	return f ? res : -res;
}


int main(void) {
	cout << divide(2147483647, 2) << endl; //3 6 12-4 (24), 12和8 -
	system("pause");
	return  0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值