将两数相除

2024-04-26 16:28
文章标签 两数 相除

本文主要是介绍将两数相除,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

首先对被除数和除数为特殊值时出现越界问题进行判断。

当被除数为 32 位有符号整数的最小值 −2^31时:

        如果除数为 1,那么我们可以直接返回答案 −2^31
        如果除数为 −1,那么答案为 2^31,产生了溢出。此时我们需要返回 2^31−1
当除数为 32 位有符号整数的最小值 −2^31时:

        如果被除数同样为 −2^31 ,那么我们可以直接返回答案 1;
        对于其余的情况,我们返回答案 0。
当被除数为 0 时,我们可以直接返回答案 0。

本题最易思考出来的解法为减法暴力求解,但是由于会超时,故选择二分查找法。

class Solution {
public:int divide(int dividend, int divisor) {// 考虑被除数为最小值的情况if (dividend == INT_MIN) {if (divisor == 1) {return INT_MIN;}if (divisor == -1) {return INT_MAX;}}// 考虑除数为最小值的情况if (divisor == INT_MIN) {return dividend == INT_MIN ? 1 : 0;}// 考虑被除数为 0 的情况if (dividend == 0) {return 0;}// 一般情况,使用二分查找// 将所有的正数取相反数,这样就只需要考虑一种情况bool rev = false;if (dividend > 0) {dividend = -dividend;rev = !rev;}if (divisor > 0) {divisor = -divisor;rev = !rev;}// 快速乘auto quickAdd = [](int y, int z, int x) {// x 和 y 是负数,z 是正数// 需要判断 z * y >= x 是否成立int result = 0, add = y;while (z) {if (z & 1) {// 需要保证 result + add >= xif (result < x - add) {return false;}result += add;}if (z != 1) {// 需要保证 add + add >= xif (add < x - add) {return false;}add += add;}// 不能使用除法z >>= 1;}return true;};int left = 1, right = INT_MAX, ans = 0;while (left <= right) {// 注意溢出,并且不能使用除法int mid = left + ((right - left)>>1);bool check = quickAdd(divisor, mid, dividend);if (check) {ans = mid;// 注意溢出if (mid == INT_MAX) {break;}left = mid + 1;}else {right = mid - 1;}}return rev ? -ans : ans;}
};

这篇关于将两数相除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938071

相关文章

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

Leetcode面试经典150题-2.两数相加

解法都在代码里,不懂就留言或者私信 理论上提交这个就是最优解 字节考过不下20次,这个高居字节面试榜第9名 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) {

【LeetCode】01.两数之和

题目要求 做题链接:1.两数之和 解题思路 我们这道题是在nums数组中找到两个两个数使得他们的和为target,最简单的方法就是暴力枚举一遍即可,时间复杂度为O(N),空间复杂度为O(1)。 代码实现 class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {//暴力枚举int n=nums

力扣第一题:两数之和

文章目录 需求分析代码结尾 需求 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[

【Hot100算法刷题集】哈希-01-两数之和(暴力枚举再优化,也不是哈希表的对手)

🏠关于专栏:专栏用于记录LeetCode中Hot100专题的所有题目 🎯每日努力一点点,技术变化看得见 题目转载 题目描述 🔒link->题目跳转链接 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那 两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任

一个google的面试题 计算两个整数相除

Divide number and return result in form of a string. e.g 100/3 result should be 33.(3) Here 3 is in brackets because it gets repeated continuously and 5/10 should be 0.5. 这题难在怎么去判断循环和记录循环出现的位置 上代码:

欧几里德算法(求两数最大公因数)

两个整数的最大公因数(gcd)是同时整除两个大最大整数。即gcd(50,15)=5.      算法连续计算余数直到除数为0,最后的非0余数就是最大公因数。因此若M=1989,N=1590,则余数是399,393,6,3,0,从而gcd(1989,1590)=3,这是一个快速算法。 public static long gcd(long m,long n){ while(n !

LeetCode题集-1- 两数之和

这个题目是什么意思呢?简单来说就是在一个数组中找出两个元素,使其和为我们设定的值,并且每个元素只能用一次。 如下图具体示例: 到这里不知道你是否已经有解题思路了呢? 解法一:双层循环 我第一反应就是双层循环,直接暴力破解。因为题目要求每个元素只能使用一次,并且已经计算过的也没必要再次计算,因此内层循环索引起始可以以外层索引+1作为起始点,具体代码如下: public stati

力扣1.两数之和(哈希表)

class Solution {// 定义一个名为twoSum的方法,接收一个整数数组nums和一个整数target作为参数public int[] twoSum(int[] nums, int target) {// 创建一个HashMap,用于存储数组中的元素及其对应的索引Map<Integer, Integer> map = new HashMap<Integer, Integer>();/

力扣top300——2.两数相加

序号前300中非会员题 2. 两数相加 我们建立一个哨兵,方便返回使用,再建立一个指针cur,来一个个建立链表。 循环遍历链表,当两个链表没走到头或需要进位时继续下去。 当前结点的值为进位+两链表值%10,然后修改进位,将结果放入链表,将3个链表走到next /*** Definition for singly-linked list.* struct ListNode {* i