8. String to Integer (atoi)

出现的问题:
1.不是输出数字而是返回数字
2.遇到正负号不break
3.字符‘0’-‘9’的对应的整型范围是48-58
4.string类型的length是个函数而不是一个变量所以要用str.length()
5.最后输出的时候可以和*10再加下一位
6.例如“ +0 123”也要返回0

自己的代码(40ms):

#include "stdafx.h"

#include<iostream>
#include<string>
#include<vector>
#include<math.h>
using namespace std;
int main()
{
    string str;
    vector<int> jishu;
    cin >> str;
    int flag = 0, count = 0,sym = 0 ;
    int result = 0;
    for (int i = 0; i < str.length(); i++)
    {

        if (str[i] >= 48 && str[i] < 59)
        {
            //cout << int(a[i] - '0') << endl;
            /*if (sym == 1)
            {
                jishu.push_back(-int(str[i] - '0'));
                sym = 0;
            }
            else */
            jishu.push_back(int(str[i] - '0'));
            flag = 1;
        }
        else if (str[i] == 45&&flag!=1)
        {
            if (sym != 0)
                break;
            sym = 1;
            flag = 1;

        }
        else if (str[i] == 43 && flag != 1)
        {
            if (sym != 0)
                break;
            sym = 2;
            flag = 1;
        }
        else if (str[i] == ' '&& flag != 1)
        {
            continue;
        }
        else 
        {
            break;
        }
    }
    for (int i = 0; i < jishu.size(); i++)
    {
        /*if (jishu[i] < 0)
        {   
            jishu[i] = -jishu[i];
            result += jishu[i] * pow(10, count);
            result = -result;
        }
        else*/
        result = count*10+jishu[i];
        if (result / 10 != count)
        {
            if (sym == 1)
                return INT_MIN;
            else
                return INT_MAX;
        }
        count = result;
    }
    if (sym == 1)
        result = -result;
    cout << result;
    getchar();
    return 0;
}

大牛写的代码分析:

int atoi(const char *str) {
    int sign = 1, base = 0, i = 0;
    //除去字符串前面的空格
    while (str[i] == ' ') { i++; } 
    //当遇到字符为'-'时,则sign为-1,否则为1
    if (str[i] == '-' || str[i] == '+') {
        sign = 1 - 2 * (str[i++] == '-'); 
    }
    //当符号后(或者无符号)遇到字符为数字的时候进行转换
    //若先遇到非符号或者非数字的情况的时候,则直接返回0
    while (str[i] >= '0' && str[i] <= '9') {
    //1.若在加上最后一位之前的数大于了INT_MAX/10,则说明加上最后一位后一定会溢出,而atoi的函数功能是当遇到最大溢出
    //的时候则输出最大值就可以,所以直接根据符号进行return最大和最少值即可。
    //2.若加上最后一位之前的数等于INT_MAX/10,则加上最后一位有可能不会溢出,则这时候需要进行判断,由于int最大值为
    //2147483647,则最后一位大于7则溢出,操作同上
        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
            if (sign == 1) return INT_MAX;
            else return INT_MIN;
        }
        base  = 10 * base + (str[i++] - '0');
    }
    return base * sign;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值