有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字 - 一个点
'.'
,后面跟着至少一位数字
- 至少一位数字,后面跟着一个点
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s
,如果 s
是一个 有效数字 ,请返回 true
。
思路一:利用正则表达式
# define die return false
# define cum return true
# define move_next s++
# define isEOF (*s=='\0')
# define isSIGN (*s=='+' || *s=='-')
# define isDIGIT (*s<='9' && *s>='0')
# define isDOT (*s=='.')
# define isLETTERE (*s=='e' || *s=='E')bool isNumber(char *s)
{if isSIGN move_next;if isDIGIT { move_next;while isDIGIT move_next;if isDOT move_next;else if isEOF cum;else ;
}
else if isDOT { move_next;if isDIGIT move_next;else die;
}
else die;while isDIGIT move_next;if isEOF cum;
else if isLETTERE { move_next;if isSIGN move_next;if isDIGIT { move_next;while isDIGIT move_next;if isEOF cum;else die;}else die;
}
else die;}
分析:
本题要求判断输入数字是否为有效数字,可使用正则表达式来进行判断,因c语言无法调用正则表达式regex所以定义判断是否有小数点,是否有e,是否有加减符号等。
思路二:分类讨论
bool isNumber(char * s){bool bIsNum = false;while (' ' == *s) {s++;}if ('-' == *s || '+' == *s) {s++;}while (isdigit(*s)){bIsNum = true;s++;}if ('.' == *s) {s++;}while (isdigit(*s)){bIsNum = true;s++;}if (true == bIsNum && 'e' == *s){s++;bIsNum = false;if ('+' == *s || '-' == *s){s++;}while (isdigit(*s)) {s++;bIsNum = true;}}while (' ' == *s){s++;}return '\0' == *s && bIsNum;
}
分析:
本题同时还可用分类讨论的思想,将每种情况均考虑进去,判断是否有小数点,符号等
总结:
本题并不难,只是需要讨论的情况较多,需要考虑到所有可能的情况。