StrToInt, not equal to atoi

这道题目当时写的leetcode那个其实还是不是非常好,因为只是和lib里atoi完全一致,但是他的很多需求很奇怪,我觉得还是要重新实现,
模仿July的需求来设计这个function,另外今天看到一个合法全数字的string到int的算法

int num=0;
while(*string!=\0')
{
    num=10*num+string-'0';
    string++;
}

当时还以为有问题,但是完全手动模拟发现完全正确,我一直都是按照weight来累加,先计算位数,然后weight逐个pow(10,weight)这样,居然看到这个很新鲜。
后来想想,这种迭代的严格来说都有个或简单或复杂的数学递推式,例如这里 an=a(n-1) 10+sn 其中下标是1-base, ai表示高位开始1到i位的十进制数,si表示从高位开始第i位数字,于是就
好理解了,1=0
10+1, 12=110+2,123=1210+3,于是可以这么迭代下去计算最后的值.而且我也感觉July给的答案也不是我那个代码的样子。。。

bool valid(char *str)
{
    int i=0;
    if((str[i]<='9' && str[i]>='0') || str[i] == '.'||str[i]=='+' || str[i]=='-')//first can be dot
        i++;
    else
        return false;
    int dotcount=0;
    while(i<strlen(str))
    {
        if((str[i]<='9' && str[i]>='0'))
            i++;
        else if (str[i]=='.')//dot can be any place
        {
            i++;
            dotcount++;
            if(dotcount>1)//only one dot
                return false;
        }
        else //invalid char
            return false;
    }
    return true;
}
bool invalid=false;//global value for invalid input parameter
int StrtoInt(char* str)
{
    int len;
    if(str==NULL) {cout<<"pointer NULL";invalid=true;return -1;}//-1 just can be any value, as a global value as flag
    if((len=strlen(str))==0) {cout<<"string NULL";invalid=true;return -1;}
    if(!valid(str)) {cout<<"not valid string";invalid=true;return -1;}
    int i=0;
    bool IsNegative=false;
    if(str[i]=='-')
    {
        IsNegative=true;
        i++;
    }
    else if(str[i]=='+')
    {
        i++;
    }
    else
        ;
    int num=0;
    bool overflow=false;
    while(i<len && str[i]!='.')
    {
        int originalnum=num;
        num=10*num+str[i]-'0';
        if(num>0 && originalnum <0 || num<0 && originalnum >0)
            overflow=true;
    }
    if(overflow==true)
    {
        cout<<"overflow";
        invalid=true;
        return -1;
    }
    if(i==len)
    {
        if(IsNegative==true)
            return -num;
        else
            return num;
    }
    else
    {
        i++;
        int weight=-1;
        while(i<len)
        {
            num+=pow(10,weight)*(str[i]-'0');//int not overflow, float can not overflow
            weight--;
        }
        if(IsNegative==true)
            return -num;
        else
            return num;
    }
}

代码写完了,
1)判断char* null, 空字符串(注意两者区别)
2)判断string has invalid char
3)符号处理(记得返回也要处理)
4)算值,整数部分新的迭代式,避免计算整数部分位数,小数部分用weight累加(记得判溢出,只需整数部分)
5)后处理negative 符号

不确定是否完全正确= = 由于LZ没有意识到返回Int竟然还算了小数部分,抱歉。。。。

最后发现书上答案是不需要单独去先遍历一遍去判断非法字符的,我感觉需求和书上还有有出入,例如只有 + - 或者这种非法都是返回0 而且不标记串非法。。。而且判溢出直接与最大数去比较,不是我这种
累加看是否正的变为负的。。。代码还是比那个麻烦。。

Posted by richard爱闹 - 7月 14 2014
如需转载,请注明: 本文来自 Richard