在C++程序中使用abs()超过时间限制
Time Limit Exceeded with abs() in a C++ Program
我在一个程序中遇到了abs()的问题。当我使用代码时:
long long dvd = abs(dividend), dvs = abs(divisor);
据报道"超过时限"
使用时:
long long dvd = dividend, dvs = divisor;
dvd = abs(dvd);
dvs = abs(dvs);
一切都很好。。。
完整代码如下:
class Solution {
public:
int divide(int dividend, int divisor) {
long long dvd = dividend, dvs = divisor;
dvd = abs(dvd);
dvs = abs(dvs);
long long result = 0;
while (dvd >= dvs) {
long long temp = dvs;
int i = 0;
while (dvd >= temp) {
temp = temp << 1;
i++;
}
dvd -= dvs << (i-1);
result += (long long)1 << (i-1);
}
result = ((long long)dividend > 0 ^ (long long)divisor > 0) ? -result : result;
if (result > (1<<31) - 1)
return (1<<31) - 1;
return result;
}
};
有人能在这里解释一下abs()
发生了什么吗?
abs()
很可能是一个定义如下的宏:
#define abs(x) (((x)<0)?-(x):(x))
或类似定义的模板:
template <typename T>
T abs (T x) { return (x < 0) ? -x : x; }
因此,abs()
的结果值采用与其参数相同的类型。对于int
类型的参数,abs(INT_MIN)
可能定义得很好,也可能定义得不好,因为它可能会导致有符号整数溢出。(从技术上讲,有符号整数溢出会调用未定义的行为。)然而,在2s补码系统上,它可能会产生INT_MIN
本身。
对于以下情况(给出时限错误的情况):
int divide(int dividend, int divisor) {
long long dvd = abs(dividend), dvs = abs(divisor);
如果divisor
是INT_MIN
,那么dvs
很可能是INT_MIN
。因此,它是负面的。
现在,稍后,您将获得:
long long temp = dvs;
int i = 0;
while (dvd >= temp) {
temp = temp << 1;
i++;
}
如果dvd
是非负的,这是一个无限循环。这是因为CCD_ 12变为CCD_。
你的"固定"版本之所以有效,是因为这里:
int divide(int dividend, int divisor) {
long long dvd = dividend, dvs = divisor;
dvd = abs(dvd);
dvs = abs(dvs);
您已将参数的类型更改为abs()
,使其成为long long
,并由int
初始化。因此,如果dvs
是(long long)INT_MIN
,则abs(dvs)
是-(long long)INT_MIN
,只要是sizeof(int) < sizeof(long long)
的正数。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- KMP算法和LPS表构造的运行时间
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间