Divide Two Integers

简介: Divide two integers without using multiplication, division and mod operator. 思路: 这道题属于数值处理的题目,对于整数处理的问题,在Reverse Integer中我有提到过,比较重要的注意点在于符号和处理越界的问题。

Divide two integers without using multiplication, division and mod operator.

思路:

这道题属于数值处理的题目,对于整数处理的问题,在Reverse Integer中我有提到过,比较重要的注意点在于符号和处理越界的问题。对于这道题目,因为不能用乘除法和取余运算,我们只能使用位运算和加减法。比较直接的方法是用被除数一直减去除数,直到为0。这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n)。

那么有没有办法优化呢? 这个我们就得使用位运算。我们知道任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n。基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到大于被除数之前得到一个最大的基。然后接下来我们每次尝试减去这个基,如果可以则结果增加加2^k,然后基继续右移迭代,直到基为0为止。因为这个方法的迭代次数是按2的幂直到超过结果,所以时间复杂度为O(logn)。num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n,其中num作为被除数,而a_0 a_1 ... a_n作为除数是一样的,这样算出的商也就是这些除数的系数之和。

例如:如果100除以2,可以用100=2*2+2*2^4+2*2^5计算出来。首先将2左移最大的k位,使得有2*2^k小于100,然后将100-2*2^k,即为36,然后继续计算使得2*2^k小于36的最大值,依次下去。

 

注意其其中处理溢出的方法,由于INT_MIN转换为正数之后会溢出,因此将转换的数先减去一个除数,同时将商增加1.

C++实现代码:

#include<iostream>
#include<climits>
#include<cmath>
using namespace std;

class Solution
{
public:
    int divide(int dividend, int divisor)
    {
        unsigned int divid,divis;
        long long res=0;
        if(dividend==INT_MIN)
        {
            res = 1;
            dividend +=abs(divisor);
        }
        divid=abs(dividend);
        divis=abs(divisor);
        while(divid>=divis)
        {
            int digit = 0;
            while(divis<=divid)
            {
                divis<<= 1;
                digit++;
            }
            divid-=divis>>1;
            res+=1<<(digit-1);
            divis=abs(divisor);
        }
        return (dividend>0)^(divisor>0)?-res:res;
    }
};
int main()
{
    Solution s;
    cout<<s.divide(-2147483648,2)<<endl;
}

 

相关文章
|
8月前
|
数据可视化 API 开发者
R1类模型推理能力评测手把手实战
随着DeepSeek-R1模型的广泛应用,越来越多的开发者开始尝试复现类似的模型,以提升其推理能力。
520 3
|
存储 缓存 Shell
Transformers 4.37 中文文档(一)(3)
Transformers 4.37 中文文档(一)
1093 1
Transformers 4.37 中文文档(一)(3)
|
Python
Langchain使用OpenAI报错AttributeError: module ‘openai‘ has no attribute ‘error 的解决方案
这篇文章描述了作者在使用Python的`openai`和`langchain`库时遇到的错误,错误的提示是`AttributeError: module 'openai' has no attribute 'error'`。文章通过分析环境和版本信息,发现问题出在`langchain`库的版本过旧。作者通过卸载旧版本并安装指定版本的`langchain`库解决了问题,并总结了在遇到此类问题时检查和更新依赖库的重要性。
1933 2
|
存储 机器学习/深度学习 人工智能
基于Megatron-Core的稀疏大模型训练工具:阿里云MoE大模型最佳实践
随着大模型技术的不断发展,模型结构和参数量级快速演化。大模型技术的应用层出不穷。大模型展现惊人效果,但训练和推理成本高,一直是巨大挑战。模型稀疏化能降低计算和存储消耗。近期以Mixtral为代表的MoE(多专家混合)大模型证明了稀疏MoE技术能大幅降低计算量、提升推理速度,模型效果甚至超过同规模稠密模型。阿里云PAI和NVIDIA团队深入合作,基于Megatron-Core MoE框架,解决了MoE大模型训练落地时会遇到的可拓展性、易用性、功能性以及收敛精度等核心问题,在下游任务上取得了很好的模型效果。
|
机器学习/深度学习 缓存 数据可视化
wandb使用教程(持续更新ing...)
wandb使用教程(持续更新ing...)
13639 0
wandb使用教程(持续更新ing...)
|
3天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
1天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。
|
2天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
4天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
546 2