init commit

This commit is contained in:
2024-03-19 01:05:51 +08:00
commit 199bbf2628
393 changed files with 34883 additions and 0 deletions

View File

@ -0,0 +1,127 @@
#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;
}