剑指Offer——表示数值的字符串
2016-05-23 19:45
369 查看
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如字符串"+100"、"5e2"、"-123"、"3,14"及”-1E-16“都表示数值,但”12E“、”1A3.14“、"1.2.3"、"+-6"及”10e+o.5“都不是数值。
#include <iostream>
#include <stdio.h>
using namespace std;
bool isExponential(char **strings);
bool scanDigits(char **strings);
bool isNumberic(char *strings)
{
if(strings==NULL)
return false;
if(*strings=='+'||*strings=='-')//第一个字符为+/=
++strings;
bool numberic=true;//是否为一个整数
bool hasDigits=scanDigits(&strings);//引用传递参数
if(*strings!='\0')
{
//含有小数点
if(*strings=='.')
{
++strings;
//小数点之后紧跟着E/e
if(*strings=='e'||*strings=='E')
return false;
//小数点之后没有数字
if(!hasDigits&&*strings=='\0')
return false;
scanDigits(&strings);
//科学计数法表示的小数
if(*strings=='e'||*strings=='E')
numberic=isExponential(&strings);
}
else if(*strings=='e'||*strings=='E')
numberic==isExponential(&strings);
else
numberic=false;
}
return numberic&&*strings=='\0';
}
//遍历0-9数字
bool scanDigits(char **strings)
{
char *pBefore=*strings;
while((**strings)!=0&&(**strings>='0')&&(**strings<='9'))
++(*strings);
return *strings>pBefore;
}
bool isExponential(char **strings)
{
if(**strings!='e'&&**strings!='E')
return false;
++(*strings);//向后遍历
if(**strings=='+'||**strings=='=')
++(*strings);
//加号之后再无数字
if(**strings=='\0')
return false;
scanDigits(strings);
return(**strings=='\0')?true:false;
}
//测试程序
void Test(char *testname,char *str,bool expected)
{
if(testname!=NULL)
printf("%s begins:\n",testname);
if(isNumberic(str)==expected)
printf("Passed.\n");
else
printf("Failed.\n");
}
int main()
{
Test("test1","12.34e+6",true);
Test("test2","-1e-16",true);
Test("test3","1.2.3",false);
return 0;
}
例如字符串"+100"、"5e2"、"-123"、"3,14"及”-1E-16“都表示数值,但”12E“、”1A3.14“、"1.2.3"、"+-6"及”10e+o.5“都不是数值。
#include <iostream>
#include <stdio.h>
using namespace std;
bool isExponential(char **strings);
bool scanDigits(char **strings);
bool isNumberic(char *strings)
{
if(strings==NULL)
return false;
if(*strings=='+'||*strings=='-')//第一个字符为+/=
++strings;
bool numberic=true;//是否为一个整数
bool hasDigits=scanDigits(&strings);//引用传递参数
if(*strings!='\0')
{
//含有小数点
if(*strings=='.')
{
++strings;
//小数点之后紧跟着E/e
if(*strings=='e'||*strings=='E')
return false;
//小数点之后没有数字
if(!hasDigits&&*strings=='\0')
return false;
scanDigits(&strings);
//科学计数法表示的小数
if(*strings=='e'||*strings=='E')
numberic=isExponential(&strings);
}
else if(*strings=='e'||*strings=='E')
numberic==isExponential(&strings);
else
numberic=false;
}
return numberic&&*strings=='\0';
}
//遍历0-9数字
bool scanDigits(char **strings)
{
char *pBefore=*strings;
while((**strings)!=0&&(**strings>='0')&&(**strings<='9'))
++(*strings);
return *strings>pBefore;
}
bool isExponential(char **strings)
{
if(**strings!='e'&&**strings!='E')
return false;
++(*strings);//向后遍历
if(**strings=='+'||**strings=='=')
++(*strings);
//加号之后再无数字
if(**strings=='\0')
return false;
scanDigits(strings);
return(**strings=='\0')?true:false;
}
//测试程序
void Test(char *testname,char *str,bool expected)
{
if(testname!=NULL)
printf("%s begins:\n",testname);
if(isNumberic(str)==expected)
printf("Passed.\n");
else
printf("Failed.\n");
}
int main()
{
Test("test1","12.34e+6",true);
Test("test2","-1e-16",true);
Test("test3","1.2.3",false);
return 0;
}
相关文章推荐
- nodejs完整登陆交互
- js制作淘宝放大镜效果
- nodejs模拟get,post 进行字符统计功能
- jquery ajax处理后端传回数据
- Angular 怎么在加载中加入 Loading 提示框
- js中通过javascriptbBridge调用客户端方法
- 锋利的jQuery之事件
- JSP自定义标记
- css垂直和水平居中显示
- JQuery开发1-显示或者影藏网页部分内容
- AngularJs(二)设计思想和常用功能
- jquery 获取select数组与name数组长度
- JavaScript闭包中的this
- UnsafeMutablePointer<CGPoint> 转化为CGPoint
- Js中的空值判断
- 关于JS面向对象的问题一
- [Effective JavaScript 笔记]第15条:当心局部块函数声明笨拙的作用域
- css垂直居中
- javascript 判断一个数字是否为质数实现方式若干 by FungLeo
- angular run()运行块