思路:大体就是从串头开始读取每个数据,去除以下几种开头非法情况:
(1)若开头纯连续性空白符' '需要吃掉所有的空白符再开始判断
(2)首字符必须是 + - 或者数字,若不是返回0
(3)非数字情形皆返回已读的res(res初始化为0)
举例如:
读取数字过程中遇到如31.1415925的情况,读取到' . '时,应该将读取结果31返回。
读取数字过程中遇到非数字的其他符号,如 +31ad234 当读取到' a '时,应该将结果31返回。
读取数字过程中遇到如 +-43 的情况,读取到+时合法,读取到-时非数字返回res,res初始化是0。
整个思路:
读取到' - '说明数字为负数,所以 res = res * 10 - (str.at(i) - '0'); 这里用的减法
读取到' + '说明数字为正数,所以 res = res * 10 + (str.at(i) - '0'); 这里用的加法
其中对于res的溢出判断:(int 合法范围[ -2147483648 , 2147483647 ])
//MAX=2147483647 //MIn=-2147483648
正数情况: res>MAX/10 , 无论下面的字符串中的数字多小,一定溢出
res<MAX/10 , 无论下面的字符串中的数字有多大,一定不会溢出
res=MAX/10 ,当数字大于7时候就会溢出
负数情况: (此时要考虑一下与逆转中的不同,本题res是负的,但是在str中读取的 str.at(i) - '0' 这个int 数字是正数)
在逆转中的负数溢出判断条件为:
res>MIN/10 , 无论下面的字符串中的数字有多大,一定不会溢出
res<MIN/10 , 无论下面的字符串中的数字多小,一定溢出
res=MIN/10 , 当数字小于-8时候就会溢出 ( 数字是-9就溢出 )
此题目负数溢出判断条件为:
res>MIN/10 , 无论下面的字符串中的数字有多大,一定不会溢出
res<MIN/10 , 无论下面的字符串中的数字多小,一定溢出
res=MIN/10 , 当数字大于8时候就会溢出 ( 数字是9就溢出 )
其实在读取的由于要开头的正负性不同,导致相加的时候均为正数为加法,负数为减法
为了让代码趋于一致性,可以均用 res=res*10+ str.at(i) - '0' ,在return res时候加上正负号
只不过在一开始不要给res正负性,只有当正数溢出至
res > (INT32_MAX / 10) || res == (INT32_MAX / 10)) && ((str.at(i) - '0') > 7)
时候,根据第一个读取的 + - 号来判定。若正溢出,若负继续判定下列式子
res > (INT32_MAX / 10) || res == (INT32_MAX / 10)) && ((str.at(i) - '0') > 8)
当负时,若满足此式则溢出,返回0
# include<iostream>
using namespace std;
int myAtoi(string str) {
if (str.empty()||str=="")return 0;//空
int ii = 0;
bool f = false;
while (str.at(ii++) == ' '&&ii<str.length());//一直排除空格
if ((str.at(ii-1) != '-') && (!(str.at(ii-1) >= '0' && str.at(ii-1) <= '9'))&& (str.at(ii - 1)!='+'))return 0;//非数字或者正负号开头
if (str.at(ii - 1) == '-')f = true;
int res = 0;
for (int i = ii - 1; i < str.length(); i++) {
if (str.at(i) >= '0' && str.at(i) <= '9') {//数字的情形下
if ((res > (INT32_MAX / 10)) || ((res == (INT32_MAX / 10)) && ((str.at(i) - '0') > 7)))return INT32_MAX;//正数溢出判定
if ((res < (INT32_MIN / 10)) || ((res == (INT32_MIN / 10)) && ((str.at(i) - '0') > 8)))return INT32_MIN;//负数溢出判定
if (((res == (INT32_MIN / 10)) && ((str.at(i) - '0') > 8)))return INT32_MIN;
//未溢出
if (f) {
c
}
else {
res = res * 10 + (str.at(i) - '0');
}
}
else if ((i == ii - 1) && (str.at(i) == '+' || str.at(i) == '-')) {//非数字要屏蔽第一个+-号
;
}
else return res;
}
return res;
}
int main(void) {
cout << myAtoi("-2147483649") << endl;
return 0;
}