64-字符串中有效数值的判定-含科学计数数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiki_tangmingwei/article/details/82083087

一、题目描述

请实现一个函数用来判断是否表示数值(包括整数和小数)
例如:
字符串:“+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';
}

                                                                                                 梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/82083087
今日推荐