一、题目描述
请实现一个函数用来判断是否表示数值(包括整数和小数)
例如:
字符串:“+100”、“5e2”、“-123”、“3.1416”、“-1E-16”都表示数值
字符串:“12e”、“la3.14”、“1.2.3”、“+-5”、以及"12e+5.4"都不是
二、解题思路
不考虑字符串有多余空格的前提下,此题主要关注点如下:
1)字符串开头可能会有“+”或者“-”号
2)处理完1)之后,会跟着一串数字,走完数字后
a)情况一:是小数
后面可能会有小数点,小数点之后
aa)可能后面全是数字,一直到串尾
bb)可能后面跟着“E”或者“e”,接下来就是科学计数法判定
b)情况二:是科学计数数
做科学计数法判定
c)情况三:走完数字直接到串尾--说明就是单纯的数字
3)科学计数法判定
把一个数表示成a(1≤a<10,n为整数)与10的幂相乘的形式,这种记数法叫做科学记数法。计算器或电脑表达10的幂是一般是用E或e,也就是1.99714E13=19971400000000
所以满足科学计数法的特点主要有以下几点:
a)“E”或“e”前面为整数或者小数
b)“E”或“e”后面紧跟着一串整数数字(可以有正负号),但一定不能为小数
综合上述分析,下面的代码打算将科学计数法判定规则单独写一个function,考虑到代码的简洁和可读性,将数字的判定操作也单独写在一个function里。
三、算法实现
/******************************************
author:tmw
date:2018-8-26
*******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/** 走一串数字 scanNumber(char** str)
* @param char** str
**/
void scanNumber(char** str)
{
while( **str != '\0' && (**str >= '0' && **str <= '9') )
(*str)++;
}
/** ‘e’或‘E’开头的科学计数法判定函数 bool ScientificCountRoule(char** str)
* @param char** str
**/
bool ScientificCountRoule(char** str)
{
/**'e'/'E'后面允许有'+'/'-'号**/
if( **str == '+' || **str == '-' )
(*str)++;
/**如果‘e’/'E'后面就到串尾了,是非法数**/
if( **str == '\0' )
return false;
/**做数字扫描**/
scanNumber(str);
/**“E”或“e”后面紧跟着一串整数数字(可以有正负号),但一定不能为小数
所以数字结束了直接到串尾,则为合法数,反之就不是科学计数数
**/
return **str == '\0' ? true : false;
}
/** 主算法:isValidNumber()判定输入是否为有效数值
* @param char* str
**/
bool isValidNumber( char* str )
{
if( str == NULL ) return false;
if( *str == '+' || *str == '-' )
str++;
/**符号判定完就是'\0'或者刚开始就是'\0',则返回false**/
if( *str == '\0' )
return false;
/**走一串数字**/
scanNumber(&str);
bool judge = true;
/**走完一串数字后,对小数和科学计数数分别做处理**/
if( *str != '\0' )
{
/**小数情况的判断**/
if( *str == '.' )
{
str++;
scanNumber(&str);
/**如果是小数情况的科学计数--即E前面是小数**/
if( *str == 'e' || *str == 'E' )
{
str++;
judge = ScientificCountRoule( &str );
}
}
/**E前面的整数的科学计数判断**/
else if( *str == 'e' || *str == 'E' )
{
str++;
judge = ScientificCountRoule( &str );
}
/**数字走完后如果后面还有其他非法字符,则直接return false**/
else
return false;
}
/***str == '\0' 是为了滤除“1.2.3”这种case**/
return judge && *str == '\0';
}
梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~