核心内容摘要
XXLXL19D18和19D18,一场关于“大”的深度对话
求解代码//定义移位边界防止左移溢出privatestaticfinalintBOUNDInteger.MIN_VALUE1;//被除数是最小负数除数是-1返回最大正数publicintdivide(inta,intb){if(aInteger.MIN_VALUEb-
{returnInteger.MAX_VALUE;}if(a0||b
{returna;}elseif(b-
{return-a;}intnegative2;// 统一转为负数计算避免MIN_VALUE取反溢出if(a
{negative--;a-a;}//仅处理a、b均为负数的情况返回正的商if(b
{negative--;b-b;}intanshelpDivide(a,b);returnnegative1?-ans:ans;}privateinthelpDivide(inta,intb){// 被除数绝对值 除数绝对值商为1if(ab){return1;}intres0;intshiftgetMaxShift(a,b);while(ab){while(a(bshift)){shift--;}a-(bshift);// 减去 b×2^shiftres(1shift);// 商累加 2^shift}returnres;}// 获取除数b的最大有效移位次数privateintgetMaxShift(inta,intb){intshift0;inttmpb;while(tmpatmpBOUND){tmp1;shift;}returnshift;}小贴士必须以除数为起点左移倍增而非被除数。
Integer.MIN_VALUE -2^31取反会溢出。
两个负数相比较时a更小表示绝对值更大。