程序员人生 网站导航

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

栏目:php教程时间:2016-08-02 08:21:57
题目:请实现1个函数用来判断字符串是不是表示数值(包括整数和小数)。
例如,字符串“+100”,“5e2”,“⑴23”,“3.1416”及”⑴E⑴6”都表示数值,但“12e”,”1a3.14”,”1.2.3”,”+⑸”及“12e+5.4”都不是。 

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

运行结果:


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐