2024-03-19 02:45:09 +08:00

127 lines
2.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
/**
* https://leetcode-cn.com/problems/divide-two-integers/description/
* 两数相除,不能直接使用乘法除法
*/
int add(int num1, int num2)
{
while (num2)
{
int tmp = num1 ^ num2;
num2 = (num1 & num2) << 1;
num1 = tmp;
}
return num1;
}
int sub(int num1, int num2)
{
return add(num1, add(~num2, 1));
}
int negative(int num) //判断负数
{
return (num >> 31) & 1;
}
int abs_(int num)
{
if (negative(num)) //右移31位判断正负
{
return add(~num, 1); //负数
}
return num;
}
int divide(int dividend, int divisor)
{
int flag = 1;
if (negative(dividend) == negative(divisor))
{
flag = 0;
}
unsigned int x = abs_(dividend);
unsigned int y = abs_(divisor);
unsigned int result = 0;
for (int i = 31; i >= 0; i--)
{
if ((x >> i) >= y)
{
result = add(result, 1 << i);
x = sub(x, y << i);
}
}
if (flag)
{
//负数
if (result > 2147483648)
{
return 2147483647;
}
return add(~result,1);
}
else
{
//正数
if (result > 2147483647)
{
return 2147483647;
}
return result;
}
}
/*
对于int a = 0x80000000;
long long int b = -a;
而言b依然是-2147483648只不过是长长整型的-2147483648
可能是右边的-a运算由于预期的结果溢出所以就没有做负号运算
原先认为的是-a会导致溢出从而结果为0实际测试发现不是
long long int d = ((long long int)dividend > 0) ? (long long int)dividend : -(long long int)dividend;
long long int div = ((long long int)divisor > 0) ? (long long int)divisor : -(long long int)divisor;
*/
/**
int divide(int dividend, int divisor) {
if (divisor == 1)
return dividend;
if (divisor == -1)
{
if (dividend == (int)0x80000000)
return 0x7FFFFFFF;
else
return -dividend;
}
int cnt = 0, factor = 0, i = 0;
long long int d = dividend;
long long int div = divisor;
d = (d > 0) ? d : -d;
div = (div > 0) ? div : -div;
if ((dividend ^ divisor) & 0x80000000)
factor = -1;
else
factor = 1;
while (d >= div)
{
i = 0;
while (d >= (div << i))
{
d -= (div << i);
cnt += (1 << i++);
}
}
return factor*cnt;
}
*/
int main()
{
printf("%d\n", divide(-2147483648, -1));
getchar();
return 0;
}