add: 220530 [cpp]

This commit is contained in:
Eat-Swap 2022-05-30 23:10:09 +08:00
parent d45b263ac7
commit dcc2b45940
Signed by: Eatswap
GPG Key ID: BE661106A1F3FA0B
3 changed files with 59 additions and 2 deletions

57
cpp/2205/220530.cpp Normal file
View File

@ -0,0 +1,57 @@
#include <algorithm>
#include <random>
#include <ctime>
#include <cstdio>
/**
* 29. Divide Two Integers
* Given two integers dividend and divisor, divide two integers without using multiplication, division, and mod operator.
* The integer division should truncate toward zero, which means losing its fractional part. For example, 8.345 would be truncated to 8, and -2.7335 would be truncated to -2.
* Return the quotient after dividing dividend by divisor.
* - Note: Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [231, 231 1]. For this problem, if the quotient is strictly greater than 231 - 1, then return 231 - 1, and if the quotient is strictly less than -231, then return -231.
*/
class Solution {
public:
static int divide(int dividend, int divisor) {
unsigned ans = 0, cur = 1;
bool neg = (dividend ^ divisor) & 0x80000000;
unsigned r = 0x80000000 == divisor ? 0x80000000 : std::abs(divisor),
d = 0x80000000 == dividend ? 0x80000000 : std::abs(dividend);
while (r < d) {
r <<= 1;
cur <<= 1;
}
while (cur) {
if (d >= r) {
ans += cur;
d -= r;
}
cur >>= 1;
r >>= 1;
}
if (neg)
return ans > 0x80000000 ? (-2147483647 - 1) : -ans;
return ans > 0x7FFFFFFF ? 2147483647 : ans;
}
};
int main() {
Solution::divide(-2147483647 - 1, -1);
std::mt19937 r(std::time(nullptr));
for (int N = 1048576; N--; ) {
int x = r(), y = r();
int d1 = x / y, d2 = Solution::divide(x, y);
if (d1 != d2) {
std::printf("Bad answer: (%d / %d) -> %d, but %d is expected.\n", x, y, d2, d1);
return -1;
}
}
return 0;
}

View File

@ -3,4 +3,4 @@ PROJECT(2205)
SET(CMAKE_CXX_STANDARD 23) SET(CMAKE_CXX_STANDARD 23)
ADD_EXECUTABLE(2205 220529-CN.cpp) ADD_EXECUTABLE(2205 220530.cpp)

View File

@ -10,7 +10,7 @@ ELSE()
ENDIF() ENDIF()
IF(UNIX) IF(UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer")
ENDIF() ENDIF()
# Optimisation # Optimisation