《剑指offer》:[54]表示数值的字符串
2016-06-28 15:24
435 查看
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串“+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。
具体实现代码如下:
运行结果:
例如,字符串“+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); else numeric=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; else cout<<strr[i]<<": NO!"<<endl; } system("pause"); return 0; }
运行结果:
相关文章推荐
- JavaScript里最有效率的功能特征检测方法
- icono图标那些事(手机版常用nav)
- icono图标那些事(手机版常用nav)
- 《剑指offer》:[53]正则表达式匹配
- CSS选择器
- DoG(Difference of Gaussian)
- HTML5中原生的右键菜单创建方法
- javascript中encodeURI和decodeURI方法
- js 判断字符串是否包含某字符串,String对象中查找子字符indexOf,查找字符串出现的次数split
- 《剑指offer》:[52]构建乘积数组
- String 、StringBuffer、StringBulider
- 《剑指offer》数值的整数次方
- 自定义jQuery插件Step by Step
- Swiper.js使用方法
- 用CSS制造出光泽一闪而过的图片效果
- js日期格式转换
- JS笔记
- 使用HTML5里的classList操作CSS类
- JS 禁用移动流量球、禁用iframe嵌入
- JS监听回车事件