两数相除

给定两个 int 类型的数,不用乘法、除法和取模运算,计算他们的商。

输入格式

第一行依次输入被除数和除数,中间以空格间隔开。

输出格式

输出一个整数,表示它们的商。

样例输入

-1060849722  99958928

样例输出

-10
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     int n,m;
 5     while(cin>>n>>m){
 6     int flag=0;
 7     if((n<0&&m>0)||(n>0&&m<0)){
 8         flag=1;
 9     }
10     if(m==0){
11         cout<<"0"<<endl;
12     }else if(m==1){
13         cout<<n<<endl;
14     }else if(m==n){
15         cout<<"1"<<endl;
16     }else if(m==2){
17         cout<<(n>>1)<<endl;
18     }else if(n==INT_MAX&&m==INT_MIN){
19         cout<<"0"<<endl;
20     }else{
21         if(n==INT_MIN){
22             n=INT_MAX;
23         }else{
24             n=abs(n);
25         }
26         if(m==INT_MIN){
27             m=INT_MAX;
28         }else{
29             m=abs(m);
30         }
31         int num=(int)floor(exp(log(n)-log(m)));
32         if(flag){
33             num=-num;
34         }
35         cout<<num<<endl;
36     }
37     }
38     return 0;
39 }
40 /*
41 -3 2
42 -2
43 2147483647 -2147483648
44 0
45 -2147483648 2147483647
46 -1
47 -2147483648 2147483645
48 -1
49 0 0
50 0
51 0 1
52 0
53 1 0
54 0
55 1 1
56 1
57 4 5
58 0
59 6 10
60 0
61 10 6
62 1
63 4 2
64 2
65 4 3
66 1
67 4 1
68 4
69 */
时间: 2024-11-04 22:30:08

两数相除的相关文章

[leetcode] 29. 两数相除

29. 两数相除 感觉是目前遇到过的最'难'过的题... 不让你用乘除法,看样子又是个涉及位运算的题. 上来打算暴力,只用减法,结果超时. 没啥想法,遂google了一下,发现可以用位运算左移操作,将divisor变大,直到divisor << 1 < dividend ,假设此时左移了k次,这时after_divisor = 2^k * origin_divisor.此时dividend再减去after_divisor,这不相当于重复了之前暴力算法中2^k次减法操作嘛. 之后可以重复寻

LeetCode 29两数相除

给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -2 说明: 被除数和除数均为 32 位有符号整数. 除数不为 0. 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [?231, 23

LeetCode 29 - 两数相除 - [位运算]

题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = $10$, divisor = $3$输出: $3$ 示例 2: 输入: dividend = $7$, divisor = $-

Leetcode29题两数相除

题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例一: 输入: dividend = 10, divisor = 3 输出: 3 示例二: 输入: dividend = 7, divisor = -3 输出: -2 说明: 1.被除数和除数均为 32 位有符号整数.2.除数不为 0.3.假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−23

每天AC系列(十三):两数相除

1 题目 LeetCode第29题,计算两数相除的商,不允许使用乘法,除法,求模运算符. 2 减法 首先判断结果是否需要加上负号,将商置为0后,被除数不断减去除数,同时商自增.最后根据是否有负号返回相应的商. boolean negative = true; if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) negative = false; dividend = d

两数相除,判断小数位是否有限位

You are given several queries. Each query consists of three integers p, q and b. You need to answer whether the result of p/q in notation with base b is a finite fraction. A fraction in notation with base b is finite if it contains finite number of n

LeetCode 29——两数相除

1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. $$ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{lna - lnb}$$ 这样就转化为指数.对数和减法运算了.因为只能对正整数取对数,因此我们首先要将两个数都取绝对值,最后再加上符号. 同时,题目要求只能存储 32 位有符号整数,因此,当数据大于上边界时,需要进行特殊处理. class Solution { public: int divide(in

LeetCode 29. 两数相除 时间击败【100.00%】 内存击败【76.25%】

不禁让我想起了计算机是怎样进行除法运算的,单独考虑溢出以及边界情况,单独考虑符号,其他过程和我们小学除法是一模一样的:左移除数(十进制就是扩大十倍,二进制扩大两倍),直到正好比被除数小,一边累加商(在我的代码里就是33行)一边减小被除数,直到被除数不能减小,右移除数,重复上述过程. 1 public int divide(int dividend, int divisor) { 2 if (dividend == Integer.MIN_VALUE && divisor == -1) re

利用随机数 求两数相减不退位

static void Main(string[] args)        {            while (true)            { int a, b, c,m,n;                Random r = new Random();  //主要的就是三位数的百分位最大不会同时取到四位数的百分位,也就是说c永远小于b;                a = r.Next(1,10);                b=r.Next(2, 10);