站外一求助
  • 板块灌水区
  • 楼主zyx_dzpd
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/26 21:35
  • 上次更新2024/5/27 11:45:27
查看原帖
站外一求助
1351767
zyx_dzpd楼主2024/5/26 21:35

老师上课让做的 老师的题目如下哦

有效数字

描述

有效数字(按顺序)可以分成以下几个部分:

1.一个小数或者整数

2.(可选)一个'e'或'E',后面跟着一个整数

小数(按顺序)可以分成以下几个部分:

1.(可选)一个符号字符('+'或'-')

2.下述格式之一:

1.至少一位数字,后面跟着一个点'.'

2.至少一位数字,后面跟着一个点'.',后面再跟着至少一位数字

3.一个点'.',后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

1.(可选)一个符号字符('+'或'-')

2.至少一位数字

给你一个字符串s,如果s是一个有效数字,请返回true。

输入

一行,包含一个字符串。

输出

一行,包含一个整数。

输入样例 1

0

输出样例 1

true

输入样例 2

e

输出样例 2

false

输入样例 3

.

输出样例 3

false

输入样例 4

123.456e789

输出样例 4

true

提示

部分有效数字列举如下:["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"]

数据范围: 1 <= s.length <= 20 s仅含英文字母(大写和小写),数字(0-9),加号'+',减号'-',或者点'.'。

老师的代码:

#include "bits/stdc++.h"

using namespace std;

// 定义字符类型的常量
const int CHAR_NUMBER = 0; // 0 - 9
const int CHAR_EXP = 1; // e E
const int CHAR_POINT = 2; // .
const int CHAR_SIGN = 3; // + -
const int CHAR_ILLEGAL = 4; 

// 定义状态类型的常量
const int STATE_INITIAL = 0;
const int STATE_INT_SIGN = 1;
const int STATE_INTEGER = 2;
const int STATE_POINT = 3;
const int STATE_POINT_WITHOUT_INT = 4;
const int STATE_FRACTION = 5;
const int STATE_EXP = 6;
const int STATE_EXP_SIGN = 7;
const int STATE_EXP_NUMBER = 8;
const int STATE_END = 9;

// 函数toCharType将输入字符转换为字符类型的常量
int toCharType(char ch) {
    if (ch >= '0' && ch <= '9') {
        return CHAR_NUMBER;
    } else if (ch == 'e' || ch == 'E') {
        return CHAR_EXP;
    } else if (ch == '.') {
        return CHAR_POINT;
    } else if (ch == '+' || ch == '-') {
        return CHAR_SIGN;
    } else {
        return CHAR_ILLEGAL;
    }
}

bool isNumber(string s) {
    // 定义状态转移表,每个状态对应一个映射,该映射定义了从当前状态到下一个状态的转移
    unordered_map<int, unordered_map<int, int>> transfer{
            // 初始状态的转移
            {STATE_INITIAL, {  {CHAR_NUMBER, STATE_INTEGER}, {CHAR_POINT, STATE_POINT_WITHOUT_INT}, {CHAR_SIGN, STATE_INT_SIGN}  }},
            // 符号后的转移
            {STATE_INT_SIGN, {{CHAR_NUMBER, STATE_INTEGER}, {CHAR_POINT, STATE_POINT_WITHOUT_INT}}},
            // 整数部分的转移
            {STATE_INTEGER, {{CHAR_NUMBER, STATE_INTEGER}, {CHAR_EXP, STATE_EXP}, {CHAR_POINT, STATE_POINT}}},
            // 小数点后的转移
            {STATE_POINT, {{CHAR_NUMBER, STATE_FRACTION}, {CHAR_EXP, STATE_EXP}}},
            // 小数点前无整数部分的转移
            {STATE_POINT_WITHOUT_INT, {{CHAR_NUMBER, STATE_FRACTION}}},
            // 小数部分的转移
            {STATE_FRACTION, {{CHAR_NUMBER, STATE_FRACTION}, {CHAR_EXP, STATE_EXP}}},
            // 指数符号后的转移
            {STATE_EXP, {{CHAR_NUMBER, STATE_EXP_NUMBER}, {CHAR_SIGN, STATE_EXP_SIGN}}},
            // 指数符号后的转移
            {STATE_EXP_SIGN, {{CHAR_NUMBER, STATE_EXP_NUMBER}}},
            // 指数数值部分的转移
            {STATE_EXP_NUMBER, {{CHAR_NUMBER, STATE_EXP_NUMBER}}}};

    int len = s.length();
    int st = STATE_INITIAL;

    // 对每个字符执行状态转移
    for (int i = 0; i < len; i++) {
        int typ = toCharType(s[i]);
        if (transfer[st].find(typ) == transfer[st].end()) {
            // 如果没有定义从当前状态到下一个状态的转移,则字符串不是有效的数字
            return false;
        } else {
            // 如果定义了转移,则执行转移
            st = transfer[st][typ];
        }
    }
    // 如果最终的状态是有效的,则字符串是一个有效的数字
    return st == STATE_INTEGER || st == STATE_POINT || st == STATE_FRACTION ||
           st == STATE_EXP_NUMBER || st == STATE_END;
}

int main() {
    string t;
    getline(cin, t);
    cout << (isNumber(t) ? "true" : "false");
    return 0;
}

/**
 * 首先定义了两组常量来表示字符类型(CharType)和状态类型(State)。这两组常量都是用整数来表示的。
 * 
 * 然后定义了一个函数 toCharType,这个函数的作用是将输入字符转换为相应的字符类型。
 * 例如,如果输入的字符是 '0' 到 '9' 之间的数字,函数就会返回 CHAR_NUMBER 常量。
 * 
 * 然后,定义了一个有限状态机(FSM)。这个 FSM 是由一个状态转换表 transfer 来定义的,它是一个嵌套的哈希映射(unordered_map)。这个状态转换表定义了从一个状态到另一个状态的所有可能的转换。
 * 例如,从初始状态 STATE_INITIAL,如果遇到一个数字字符(CHAR_NUMBER),状态就会转换到 STATE_INTEGER。
 * 
 * 在 isNumber 函数中,我们遍历输入字符串中的每一个字符,然后根据当前的状态和字符类型,用状态转换表来确定下一个状态。
 * 如果在状态转换表中找不到对应的状态转换,就返回 false,表示这个字符串不是一个合法的数学数字表示。
 * 
 * 最后,检查字符串遍历完成后的最终状态,如果最终状态是一个合法的结束状态,那么就返回 true,表示这个字符串是一个合法的数学数字表示。
 * 如果最终状态不是一个合法的结束状态,那么就返回 false。
 */


我的代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int i,j,n=1,m;
	string a,b;
	cin>>a;
	b=a[0];
	if(a==""){
		cout<<"false\n";
		return 0;
	}
	for(i=0;i<=a.size();i++) {
		if(a[i]=='e'||a[i]=='E') a.erase(i,1);
	}
	for(i=0;i<=a.size();i++) {
		if(a[i]=='0') a.erase(i,1);
	}
	for(i=0;i<=a.size();i++) {
		if(isdigit(a[i])==0&&a[i]=='.'){
			cout<<"true\n";
			return 0;
		}
	}
	for(i=0;i<=a.size();i++){
		if(isdigit(a[i])==1){
			n=1;
			a.erase(i,1);
		}
		if(isdigit(a[i])==0){
			n=0;
			cout<<"false\n";
			return 0;
		}
	}
	if(n==1)cout<<"true\n";
    return 0;
}

最后一个判断整数竟然不对,到底哪不对 而且思路不一样,但老师说我的也行 求助!!! QAQ

2024/5/26 21:35
加载中...