zoukankan      html  css  js  c++  java
  • 表示数值的字符串

    题目

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

    解题

    1.首先判断是否有符号(+或者-),如果有,则对后面的字符串判断,需要扫描数字直到结束或是遇到其他字符,结束则返回true

    2.否则继续按情况判断下一个需要判断的字符

    • 如果是小数点'.',是则扫描数字,直到结束(返回true)或者遇到特殊字符,如果是e或E,那么对后面的数判断是否符合指数表示,如果是其他字符则返回false。
    • 如果是e或者E,那么对后面的数判断是否符合指数表示。
    • 如果不符合上面的情况则返回false

    3.判断指数:判断是否是符号,如果是,跳到下一位判断后面的是否是数字组成的串,是则表示指数表示是正确的,否则是不正确的。

    #include <iostream>
    #include <type_traits>
    using namespace std;
    
    class Solution
    {
        public:
            bool is_numberic(string s);
            bool scan_integer(string::iterator &it);
            bool scan_unsigned_integer(string::iterator &it);
    };
    bool Solution::is_numberic(string s) 
    {
        if(s.empty())
            return false;
        
        auto it=s.begin(); 
        bool num=scan_integer(it);
        
        if(*it=='.')
        {
            ++it;
            num=scan_unsigned_integer(it)||num;
        }
        if(*it=='e'||*it=='E')
        {
            ++it;
            num=num&&scan_integer(it);
        }
        return num&&*it=='';
    }
    bool Solution::scan_integer(string::iterator &it)
    {
        if(*it=='+'||*it=='-')
            ++it;
        return scan_unsigned_integer(it);
    }
    bool Solution::scan_unsigned_integer(string::iterator &it)
    {
        string::const_iterator i=it;
        while(*it!=''&&*it>='0'&&*it<='9')
            ++it;
        return it>i?true:false;
    }
    int main()
    {
        string s;
        cin>>s;
        Solution S;
        cout<<S.is_numberic(s)<<endl;
        return 0;
    }

     code2

    class Solution {
    public:
        bool isNumeric(char* str)
        {
            bool sign=false,decimal=false,hasE=false;
            for(int i=0;i<strlen(str);++i)
            {
                if(str[i]=='e'||str[i]=='E')
                {
                    if(hasE||i==(strlen(str)-1))
                        return false;
                    hasE=true;
                }
                else if(str[i]=='.')
                {
                    if(hasE||decimal||i==0)
                        return false;
                    decimal=true;
                }
                else if(str[i]=='+'||str[i]=='-')
                {
                    if(!sign&&i>0&&str[i-1]!='e'&&str[i-1]!='E')
                        return false;
                    if(sign&&str[i-1]!='e'&&str[i-1]!='E')
                        return false;
                    sign=true;
                }
                else if(str[i]<'0'||str[i]>'9')
                    return false;
            }
            return true;
        }
    
    };
  • 相关阅读:
    OpenEuler下OpenSSL的安装
    《Unix/Linux系统编程》第四章学习笔记
    缓冲区溢出实验
    2.3.1测试
    鲲鹏服务器测试
    第六章学习笔记(20191213兰毅达)
    第五章学习笔记(20191213兰毅达)
    stat命令的实现-mysate(20191213兰毅达)
    反汇编测试(20191213兰毅达)
    OpenEuler树莓派基础实验
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10176898.html
Copyright © 2011-2022 走看看