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=010+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 而且不标记串非法。。。而且判溢出直接与最大数去比较,不是我这种
累加看是否正的变为负的。。。代码还是比那个麻烦。。