珠海网站建设推广,wordpress最新的编辑器,南京建站方案,aspcms三合一网站源码目录
题目
注意#xff1a;
示例 1:
示例 2:
提示#xff1a;
题目解析
题目思路
代码思路
数据处理
注意
减法函数
第一次使用的函数
问题
第二次改良后的代码
处理i的值并且返回
总代码
力扣的代码
注意 题目 给你两个整数#xff0c;被除数 dividend 和…目录
题目
注意
示例 1:
示例 2:
提示
题目解析
题目思路
代码思路
数据处理
注意
减法函数
第一次使用的函数
问题
第二次改良后的代码
处理i的值并且返回
总代码
力扣的代码
注意 题目 给你两个整数被除数 dividend 和除数 divisor。将两数相除要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断也就是截去truncate其小数部分。例如8.345 将被截断为 8 -2.7335 将被截断至 -2 。 返回被除数 dividend 除以除数 divisor 得到的 商 。 注意
假设我们的环境只能存储 32 位 有符号整数其数值范围是 [−231, 231 − 1] 。本题中如果商 严格大于 231 − 1 则返回 231 − 1 如果商 严格小于 -231 则返回 -231 。 示例 1:
输入: dividend 10, divisor 3
输出: 3
解释: 10/3 3.33333.. 向零截断后得到 3 。
示例 2:
输入: dividend 7, divisor -3
输出: -2
解释: 7/-3 -2.33333.. 向零截断后得到 -2 。
提示
-231 dividend, divisor 231 - 1divisor ! 0 if (dividend 0)return 0;if (divisor 1)return dividend;if (divisor -1){if (dividend INT_MIN) return -dividend;// 只要不是最小的那个整数都是直接返回相反数就好啦return INT_MAX;// 是最小的那个整数都是直接返回最大值}
题目解析
这是一个让你不用除法来实现除法的题目
很奇怪代码中不能直接或者间接的用除法乘法以及求余 题目思路
由于还可以用减法以及加法
这时候可以想到小学的知识
除法的本质就是看在被除数中有几个除数
我们可以用减法来依次减去就可以了
代码思路
越界的情况
首先我们要判断给出的值越界的情况 if (dividend 0)return 0;if (divisor 1)return dividend;if (divisor -1){if (dividend INT_MIN) return -dividend;// 只要不是最小的那个整数都是直接返回相反数就好啦return INT_MAX;// 是最小的那个整数都是直接返回最大值}
数据处理
之后我们判断除数与被除数之间的的符号关系并且记录下来
并且为了方便结算全部取绝对值 long long i 0;//判断是否异号long long sum_1 (long long)dividend * divisor;//取绝对值if (dividend 0)dividend -dividend;if (divisor 0)divisor -divisor;
注意
这里的long long的数据类型是为了防止给出的数据相乘后越界并且把其中“i”变量的值记录下来用于返回
减法函数
第一次使用的函数
原来是用这个函数的 while (dividend divisor){dividenddividend-divisor;i}
问题
运行时间可能会慢因为除数是21亿并且除数是2的话要运行10亿次
第二次改良后的代码 while (dividend divisor){long long j 1;long long sum_3 divisor;while (dividend sum_3 sum_3){sum_3 sum_3 sum_3;j j j;}dividend dividend - sum_3;i i j;}
这个实现方法就是
如果是144除以2第一步执行的是144-64第二步为80-64第三步为16-16
这样运行步骤会大大降低
处理i的值并且返回 if (sum_1 0)i -i;return i;
总代码
可以直接运行的代码
#include iostream
using namespace std;
int divide(long long dividend, long long divisor)
{if (dividend 0)return 0;if (divisor 1)return dividend;if (divisor -1){if (dividend INT_MIN) return -dividend;// 只要不是最小的那个整数都是直接返回相反数就好啦return INT_MAX;// 是最小的那个整数都是直接返回最大值}long long i 0;//判断是否异号long long sum_1 (long long)dividend * divisor;//取绝对值if (dividend 0)dividend -dividend;if (divisor 0)divisor -divisor;while (dividend divisor){long long j 1;long long sum_3 divisor;while (dividend sum_3 sum_3){sum_3 sum_3 sum_3;j j j;}dividend dividend - sum_3;i i j;}if (sum_1 0)i -i;return i;
}
int main()
{//可改传递的数据int a divide(-2147483648, -3);cout a endl;return 0;
}
力扣的代码
力扣提交的代码
class Solution {
public:
int divide(long long dividend, long long divisor)
{if (dividend 0)return 0;if (divisor 1)return dividend;if (divisor -1){if (dividend INT_MIN) return -dividend;// 只要不是最小的那个整数都是直接返回相反数就好啦return INT_MAX;// 是最小的那个整数都是直接返回最大值}long long i 0;//判断是否异号long long sum_1 (long long)dividend * divisor;//取绝对值if (dividend 0)dividend -dividend;if (divisor 0)divisor -divisor;while (dividend divisor){long long j 1;long long sum_3 divisor;while (dividend sum_3 sum_3){sum_3 sum_3 sum_3;j j j;}dividend dividend - sum_3;i i j;}if (sum_1 0)i -i;return i;
}
};
注意
代码不难注意越界的数据越界的问题