两数相除(c语言)

1.//给你两个整数,被除数 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 。

2.我们要知道dividend=count*divisor,然后返回count,就可以了。先判断当dividend >0,divisor=0或者正负1的时候,进行判断,然后判断dividend=0或者正负1的时候,进行判断。然后将dividend,divisor均处理成负数,防止溢出,(注意:被除数绝对值小于除数绝对值)。然后每次相减divisor,count++,res=res+count.(注意:判断dividend是否不于0,如果大于0,说明减多了,有返回一步)。

#include<stdio.h>
int divide(int dividend, int divisor) {
    int res, count;
    int temp;
    int flag = 0;
    //判断当dividend >0&& divisor == -1|| divisor == 1的时候
    if (dividend >0&& divisor == -1|| divisor == 1) {
        if (divisor == -1)
            return -dividend;
        if (divisor == 1)
            return dividend;
    }
    //判断dividend =0
    if (dividend == 0)
        return 0;
    if (divisor == 1)
        return dividend;
    if (divisor == -1)
        return -dividend;

    // 均处理成负数,防止溢出
    if (dividend > 0 && divisor < 0) {
        flag = 1;
        dividend = -dividend;
    }

    if (dividend < 0 && divisor > 0) {
        flag = 1;
        divisor = -divisor;
    }

    if (dividend > 0 && divisor > 0) {
        dividend = -dividend;
        divisor = -divisor;
    }

    if (dividend == divisor) {
        if (flag == 0)
            return 1;
        else
            return -1;
    }

    // 被除数绝对值小于除数绝对值
    if (dividend > divisor)
        return 0;

    temp = 0;
    count = 1;
    res = 0;
    //线性增长着减,每次减dividend==count*|divisor|
    while (dividend <= divisor) {
        temp += divisor;
        dividend -= temp;
        res = res + count;
        count++;
    }
    //减多了,倒回去再一个一个减
    if (dividend > 0) {
        dividend += temp;
        res = res - count + 1;
        while (dividend <= divisor) {
            dividend -= divisor;
            res++;
        }
    }

    if (flag == 1)
        res = -res;

    return res;
}
int main()
{
    int i = 0;
    int j = 0;
    scanf_s("%d%d", &i, &j);
    int dev = divide(i, j);
    printf("%d\n", dev);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值