#include <iostream>#include <stdio.h>using namespace std;/*問題:Divide two integers without using multiplication, division and mod Operator.If it is overflow, return MAX_INT.分析:除以兩個整數不能使用乘法,除法,模運算。溢出需要返回MAX_INT。顯然,應該使用位操作了。除法的位操作,例如: 8/2=4, 9/2=4分析: a + b 如果不用除法,需要使用-關鍵:實際上可以將除法轉化為減法,比如9-2=7,7-2=5,5-2=3,3-2=1,1<2,則最后的那一次不算因此總共a / b的結果等于 a-b > b的次數需要先提取出符號,,-9/2=-4那么之所以會溢出:就應該是:減法造成的溢出,而且是兩個不同的數相減,提取出符號,讓同號數相減就不會溢出輸入:8 29 2-9 20 22 0輸出:44-40極大值關鍵:1 除法的溢出問題: -2147483648 / (-1) = 2147483648 if(INT_MIN == dividend && -1 == divisor) { return INT_MAX; }2實際上可以將除法轉化為減法,比如9-2=7,7-2=5,5-2=3,3-2=1,1<2,則最后的那一次不算3 long long dvd = labs(dividend);//如果是 -2147483648,會溢出,所以必須用long long,還必須用labs4 可以嘗試移動左移除數,使得除數放大,很快到達是否比被除數大的條件,因此,注意每左移一次,放大兩倍 減去最大的不超過被除數的左移后的除數后,仍然需要對剩余被除數重復上述操作 long long dvd = labs(dividend);//如果是 -2147483648,會溢出,所以必須用long long,還必須用labs long long dvs = labs(divisor); int result = 0; while( dvd >= dvs ) { long long temp = dvs; long long multiple = 1; while(dvd >= (temp << 1)) { temp <<= 1;//左移 multiple <<= 1;//結果次數左移 } dvd -= temp;//被除數減去除數倍數最大值 result += multiple; }*/class Solution {public: //dividend:被除數,divisor:除數。24/8=3中,其中24是被除數 int divide(int dividend, int divisor) { if(0 == divisor) { return INT_MAX; } if(0 == dividend) { 0; } //除法的溢出問題: -2147483648 / (-1) = 2147483648 if(INT_MIN == dividend && -1 == divisor) { return INT_MAX; } int symbol; if( ( dividend >= 0 && divisor >= 0 ) || ( dividend < 0 && divisor < 0 ) ) { symbol = 1; } else { symbol = -1; } long long dvd = labs(dividend);//如果是 -2147483648,會溢出,所以必須用long long,還必須用labs long long dvs = labs(divisor); int result = 0; while( dvd >= dvs ) { long long temp = dvs; long long multiple = 1; while(dvd >= (temp << 1)) { temp <<= 1;//左移 multiple <<= 1;//結果次數左移 } dvd -= temp;//被除數減去除數倍數最大值 result += multiple; } result *= symbol; return result; }};void PRocess(){ int dividend; int divisor; Solution solution; while(cin >> dividend >> divisor) { int result = solution.divide(dividend , divisor); cout << result << endl; }}int main(int argc , char* argv[]){ process(); getchar(); return 0;}
新聞熱點
疑難解答