题目详情
题解
int reverse(int x){
//数字转字符串
char s[20] = {'\0'};
sprintf(s,"%d",x);
//定位数字开头
int begin = 0;
if(s[0] == '-'){
begin++;
}
//定位数字末尾
int end = strlen(s)-1;
while(s[end] == '0' && end > begin){
s[end] = '\0';
end--;
}
//反转交换
while(end > begin){
char temp = s[begin];
s[begin] = s[end];
s[end] = temp;
begin++;
end--;
}
//判断范围、返回
int topThresh = 2147483647;
int botThresh = -2147483648;
char top[20] = {'\0'};
sprintf(top,"%d",topThresh);
char bottom[20] = {'\0'};
sprintf(bottom,"%d",botThresh);
//超限情况
if(s[0] != '-'){
if(strlen(s) > strlen(top)){
return 0;
}
if(strlen(s) == strlen(top)){
int result = strcmp(s,top);
if(result > 0){
return 0;
}
}
}else{
if(strlen(s) > strlen(bottom)){
return 0;
}
if(strlen(s) == strlen(bottom)){
int result = strcmp(s,bottom);
if(result > 0){
return 0;
}
}
}
//正常情况
x = atoi(s);
return x;
}
要点
int类型转字符串使用sprintf函数,字符串转int类型使用atoi函数。
本题难点不在于整数反转而在于判断反转后是否超出限制。思路是将上下两限也转换成字符串后使用字符串的比较strcmp函数做比较。
strcmp函数用作数字比较的说明:
1.函数说明:函数原型是int strcmp(char* s1,char* s2)。比较时是两个字符串逐个位置的比较,即在某位置比较相同时比较下一个,当遇到不相同的位置,s1该位置的ascll码>s2该位置的ascll码返回正数,否则返回负数,若所有都相同则返回0。至于返回的是1、0、-1还是ascll相减的差值看编译器,不过其实也不重要,用来做判断而已。
2.正数之间的比较:设比较s1与s2。先通过strlen函数比较s1与s2的长度,若s1的长度更长则更大长度更短则更小,没什么好说的。如果长度相等则利用strcmp函数的功能,当s1>s2时有strcmp(s1,s2)>0,当s1<s2时有strcmp(s1,s2)<0。
3.负数之间的比较:设比较s1与s2。在长度不相等方面,更长则表示负得更多为较小值。在长度相等方面,由于使用的是字符串来比较,因此s[0]都是等于'-',对strcmp的比较不影响,因此其实可以把这个符号省略,只比较后面的“正数”部分。但注意结果是相反的,正数大结果小。