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

LeetCode 刷题【29. 两数相除】

29. 两数相除

自己做

解1:逐个相减(超时)

class Solution {
public:int divide(int dividend, int divisor) {int res = 0;                              //除数默认为0,下面的处理都是dividend>0的情况,当dividend为0时,后面会直接返回这个默认值if(divisor == std::numeric_limits<int>::min())                            //溢出处理return 0;if(dividend == std::numeric_limits<int>::min() && divisor == -1)          //溢出处理return std::numeric_limits<int>::max();if(dividend > 0 && divisor > 0){while(dividend >= divisor){dividend -= divisor;res++;}}else if(dividend > 0 && divisor < 0){while(dividend >= -divisor){dividend += divisor;        //相当于dividend -= -divisor,这里就是把负的部分转为正的res--;}}else if(dividend < 0 && divisor < 0){while(dividend <= divisor){dividend -= divisor;res++;}}else if(dividend < 0 && divisor > 0){while(dividend <= -divisor){dividend += divisor;res--;}}return res;}
};

解2:移位运算

忘了

解3:应减尽减

class Solution {
public:int divide(int dividend, int divisor) {int res = 0;                              //除数默认为0,下面的处理都是dividend>0的情况,当dividend为0时,后面会直接返回这个默认值if (divisor == std::numeric_limits<int>::min() && dividend != std::numeric_limits<int>::min())  //如果dividend不为最小值,那么相除就必为0                      return 0;if (dividend == std::numeric_limits<int>::min() && divisor == -1)          //溢出处理return std::numeric_limits<int>::max();int len = 0;                                        //这里的len表示2的指数//分同号和异号两种情况if (dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0) {             //同号if (dividend > 0 && dividend < divisor ||dividend < 0 && dividend > divisor)              //除数比被除数还大,相除为0return 0;//调整divisorwhile (dividend > 0 && divisor <= (dividend >> 1) ||dividend < 0 && divisor >= (dividend >> 1)) {                    //divisor一开始尽可能取大divisor = divisor << 1;         //左移一位相当于*2len++;}//开始相减while (len >= 0) {if (dividend > 0 && dividend >= divisor ||dividend < 0 && dividend <= divisor) {                    //如果这个对应的divisor*2**len能减(尽可能大),那就减,否则就跳过dividend -= divisor;res += 1 << len;}divisor = divisor >> 1;len--;}}if (dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0) {       //异号//转为同号处理(这里divisor不为最小值)    divisor = -divisor;if (dividend > 0 && dividend < divisor ||dividend < 0 && dividend > divisor)              //除数比被除数还大,相除为0return 0;//调整divisorwhile (dividend > 0 && divisor <= (dividend >> 1) ||dividend < 0 && divisor >= (dividend >> 1)) {                    //divisor一开始尽可能取大divisor = divisor << 1;         //左移一位相当于*2len++;}//开始相减while (len >= 0) {if (dividend > 0 && dividend >= divisor ||dividend < 0 && dividend <= divisor) {                    //如果这个对应的divisor*2**len能减(尽可能大),那就减,否则就跳过dividend -= divisor;res += -1 << len;}divisor = divisor >> 1;len--;}}return res;}
};

http://www.dtcms.com/a/313312.html

相关文章:

  • 波士顿房价预测工具 - XGBoost实现
  • 2.4.1-2.4.3控制范围-控制进度-控制成本
  • C++ 生成动态库.dll 及 C++调用DLL,C++ 生成静态库.lib及 C++调用lib
  • 其它IO函数
  • 在 ArkUI 中实现丝滑嵌套滚动:让你的页面像抖音一样顺滑
  • Redis——运维篇
  • 避不开的数据拷贝
  • 北斗变形监测技术应用与优势
  • 【AI云原生】1、Function Calling:大模型幻觉破解与Agent底层架构全指南(附Go+Python实战代码)》
  • 子区间问题
  • 差分 前缀和
  • 无人机集群协同三维路径规划,采用冠豪猪优化器(Crested Porcupine Optimizer, CPO)实现,Matlab代码
  • 【Django】-8- 视图和模型的关联
  • Linux下Redis常用命令
  • Java线程安全类设计思路总结
  • 深入理解Python的`__missing__`方法:动态处理字典中不存在的键: Effective Python 第18条
  • 网络规划与设计5个阶段内容
  • 大模型学习--第一天
  • Linux命令基础(上)
  • day 44 文件的规范书写与拆分
  • LCL滤波器及其电容电流前馈有源阻尼设计软件【LCLAD_designer】
  • 机器学习——决策树(DecisionTree)
  • 分享两个问题及其解决方法:发送AT没反应和wifi模块连接不上热点
  • Java设计模式之行为型模式(访问者模式)应用场景分析
  • MATLAB小波分析工具包进行时间序列的小波功率谱分析
  • 基于Matlab的深度学习智能行人检测与统计系统
  • FastAPI入门:安全性
  • 网安-逻辑漏洞-23登陆验证
  • 【系统编程】错误处理、读写缓冲区及位图
  • 文章分享---《Keil 再升级,修复了这些bug》