当前位置: 首页 > ds >正文

力扣29. 两数相除题解

原题链接29. 两数相除 - 力扣(LeetCode)

主要不能用乘除取余,于是用位运算代替:

Java题解

class Solution {public int divide(int dividend, int divisor) {//全都转为负数计算, 避免溢出, flag记录结果的符号int flag = 1;if(dividend < 0) {flag = -flag;}else {dividend = -dividend;}if(divisor < 0) {flag = -flag;}else {divisor = -divisor;}int div = divisor;// -(用多少个负数的divisor)int ans = 0;while(div >= dividend) {// 记录这次用了多少个divisor的负数 (避免溢出)int numDiv = -1;// 如果div乘二后不溢出并且小于被除数剩下的值则乘二,本次用的divisor数量也乘二while((div << 1) < div && (div << 1) >= dividend) {numDiv = numDiv << 1;div = div << 1;}// 被除数减去 负数的divisor * (-numDiv)dividend -= div;// 增加用的divisor数量ans += numDiv;// 重置除数div = divisor;}// 两个三十二位整数合法相除,只有可能正溢出,不可能负溢出,判断特殊条件if(ans == Integer.MIN_VALUE && flag == 1) {return Integer.MAX_VALUE;}else if(flag == 1) { // ans为不带符号的商的负数return -ans;}else {return ans;}}
}

        记录下比较有意思的点,我原来返回结果写的是 -flag * ans,因为担心在ans为Integer.MIN_VALUE,flag为-1时写(flag * (-ans))会溢出,但是试了下 -1 *  (-(-2147483648)) 的结果居然是 -2147483648,并没有想象中的奇怪值。实际上它的补码10000000 00000000 00000000 00000000, 取负数以后仍然是10000000 00000000 00000000 00000000, 先按位取反得到:01111111 11111111 11111111 11111111, 加一10000000 00000000 00000000 00000000,又变回原来的了,java是静默溢出,-1 *  (-(-2147483648))会溢出两次,但是结果仍不变

http://www.xdnf.cn/news/20453.html

相关文章:

  • Qt资源系统学习
  • 【继承和派生】
  • 【Flask】测试平台开发,重构提测管理页面-第二十篇
  • 把装配想象成移动物体的问题
  • java基础学习(五):对象中的封装、继承和多态
  • C++经典的数据结构与算法之经典算法思想:排序算法
  • phpMyAdmin文件包含漏洞复现:原理详解+环境搭建+渗透实战(windows CVE-2014-8959)
  • 吴恩达机器学习(七)
  • 综合安防集成系统解决方案,智慧园区,智慧小区安防方案(300页Word方案)
  • 《2025国赛/高教杯》C题 完整实战教程(代码+公式详解)
  • 关于连接池
  • 【PostgreSQL】如何实现主从复制?
  • 网络原理-
  • 在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南
  • Qt 基础教程合集(完)
  • 分布式数据架构
  • 硬件开发_基于物联网的老人跌倒监测报警系统
  • 数据结构——栈(Java)
  • MySQL数据库约束和设计
  • 附050.Kubernetes Karmada Helm部署联邦及使用
  • C++_哈希
  • 基于阿里云ECS搭建Tailscale DERP中继服务器:提升跨网络连接速度
  • 前端登录鉴权详解
  • C++面试10——构造函数、拷贝构造函数和赋值运算符
  • 西门子S7-200 SMART PLC:编写最基础的“起保停”程序
  • [特殊字符] 从零到一:打造你的VSCode圈复杂度分析插件
  • Linux内核源码获取与编译安装完整指南
  • Java8函数式编程之Stream API
  • 预闪为什么可以用来防红眼?
  • C/C++动态爱心