老师上课让做的 老师的题目如下哦
有效数字
描述
有效数字(按顺序)可以分成以下几个部分:
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