《剑指offer》:[54]表示数值的字符串

来源:互联网 发布:重装mac系统 编辑:程序博客网 时间:2024/06/05 06:22
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示数值,但“12e”,”1a3.14”,”1.2.3”,”+-5”及“12e+5.4”都不是。 

分析:这个题主要是应用数字的表示通式来解决:表示一个数字的通式为:
                           [sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]('['和']'之间的数据都是可有可无的,可省略)
表达的意思是:[符号]整型数字[小数点[小数整数]][e|E[指数的符号]指数的整数表示].按照这个步骤思路来判断就不会错。
   看一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。如果是一个小数,则可能遇到小数点。另外如果是科学计数法,则在小数点的后面可能遇到e|E。
具体实现代码如下:
#include <iostream>using namespace std;void ScanDigits(char **str) //判断是否是0-9之间的数字;{while(**str!='\0' && **str>='0' && **str<='9')++(*str);}bool IsExponential(char **str)//判断e或E之后的表达式是否合法:符号+数字;{if(**str!='e' && **str!='E')return false;++(*str);if(**str=='+' || **str=='-')++(*str);if(**str=='\0')return false;ScanDigits(str);return (**str=='\0')?true:false;}bool IsNumber(char *str){if(str==NULL)return false;if(*str=='+' || *str=='-') //判断符号;++str;if(*str=='\0')return false;bool numeric=true;ScanDigits(&str);if(*str!='\0'){//如果是浮点数;if(*str=='.'){str++;ScanDigits(&str);if(*str=='e' || *str=='E')numeric=IsExponential(&str);}//如果是整型数的科学计数法;else if(*str=='e' || *str=='E')numeric=IsExponential(&str);elsenumeric=false;}return numeric && *str=='\0';}int main(){char *strr[4]={"5e2","-1E-16","12e+5.4","12e"};for(int i=0;i<4;i++){if(IsNumber(strr[i]))cout<<strr[i]<<":  YES!"<<endl;elsecout<<strr[i]<<":  NO!"<<endl;}system("pause");return 0;}

运行结果:


1 0
原创粉丝点击