题意描述:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
错误解法:
class Solution {
public:
int reverse(int x) {
int sum = 0;
while((x*10)/10){
sum *= 10;
sum += x%10;
x /= 10;
}
return sum;
}
};
没有考虑到溢出
AC解法:
class Solution {
public:
int reverse(int x) {
int sum = 0;
while((x*10)/10){
if(is10Overflow(sum)){
return 0;
}else{
sum *= 10;
}
if(isAddOverflow(sum, x%10)){
return 0;
}else{
sum += x%10;
}
x /= 10;
}
return sum;
}
bool isAddOverflow(int a, int b){
int c = a + b;
return ((a > 0 && b > 0 && (c < a || c < b)) || ( a < 0 && b < 0) && ( c > a || c > b));
}
bool is10Overflow(int a){
if (a > 0x7FFFFFFF / 10 || a < (int)(0x80000001) / 10)
return true;
else
return false;
}
};
关于最大值最小值:
cout << 0xFFFFFFFF << endl; //4294967295 = 2^32 - 1
cout << 0x7FFFFFFF << endl; //2147483647(max) = 2^31 - 1
cout << 0x80000001 << endl; //2147483649
cout << (int)0xFFFFFFFF << endl; // -1
cout << (int)0xFFFFFFFE << endl; // -2
cout << (int)0x80000001 << endl; // -2147483647(min)
cout << sizeof(char) << endl; //1
cout << sizeof(int) << endl; //4
cout << sizeof(float) << endl; //4
cout << sizeof(string) << endl; //8
cout << sizeof(int8_t) << endl; //1
cout << sizeof(int16_t) << endl; //2
cout << sizeof(int32_t) << endl; //4
cout << sizeof(int64_t) << endl; //8
cout << sizeof(unsigned) << endl; //4
关于溢出:
加法溢出:
a和b都是正数时,如果a与b的和小于a或者小于b,则溢出;
a和b都是负数时,如果a与b的和大于a或者大于b,则溢出;
乘法溢出:
int is_mul_overflow(int a, int b) {
if( a >= 0 && b >=0 ) {
return INT_MAX / a < b;
}
else if( a < 0 && b < 0 ) {
return INT_MAX / a > b;
}
else if( a * b == INT_MIN ) {
return 0;
}
else {
return a < 0 ? is_mul_overflow(-a, b) : is_mul_overflow(a, -b);
}
}