1 条题解
-
0
分析:
解题的核心思想是对输入的字符串进行多轮检查。首先去掉字符串前导空格,接着统计字符串中 e(或 E)和小数点的数量,根据其数量初步判断合法性。若包含 e(或 E),则进一步检查其位置以及后面的指数部分是否合法。最后检查除去符号和指数部分后,剩余部分是否为合法的数字或包含合法的小数点。
解题原理
1.预处理:去除字符串前导空格,简化后续处理。
2.计数检查:统计 e(或 E)和小数点的数量,若 e(或 E)数量大于 1、小数点数量大于 1 或者两者数量之和为 0,则判定字符串不合法。
3.e(或 E)位置与指数合法性检查:若字符串中包含 e(或 E),检查其位置是否在字符串首尾,若在则不合法。同时检查 e(或 E)后面的指数部分,若存在非数字字符则不合法。
4.数字部分合法性检查:去除符号后,检查剩余部分是否为合法数字,若包含小数点,需确保小数点位置合理。
实现步骤
1.输入读取:循环读取输入字符串,直到输入为 "*" 时停止。
2.去除前导空格:找到字符串中第一个非空格字符,截取字符串去除前导空格。
3.计数统计:统计字符串中 e(或 E)和小数点的数量。
4.初步合法性判断:根据 e(或 E)和小数点的数量,判断字符串是否合法。
5.e(或 E)及指数部分检查:若字符串包含 e(或 E),检查其位置和指数部分的合法性。
6.数字部分检查:去除符号后,检查剩余部分是否为合法数字,包含小数点时检查其位置是否合理。
7.输出结果:根据检查结果输出字符串是否合法的信息。
c++代码:
#include <iostream> #include <cstdio> using namespace std; int main() { while(1) { string s; getline(cin,s); if(s=="*") { break; } int flag=1; int i; for(i=0;i<s.size();i++) { if(s[i]!=' ') { break; } } s=s.substr(i,s.size());//去掉多余的前缀空格 //cout<<s<<endl; int p_c=0;//小数点数量 int e_c=0;//e的数量 for(int i=0;i<s.size();i++) { if(s[i]=='e'||s[i]=='E') { e_c++; } if(s[i]=='.') { p_c++; } } if(e_c>1 || p_c>1 ||(e_c+p_c)==0) { //cout<<"hi0"<<endl; flag=0; } int over=s.size(); if(flag==1 && e_c==1) { int wz=-1; for(int i=0;i<s.size();i++) { if(s[i]=='e'||s[i]=='E') { if(i==0 || i==(s.size()-1)) { flag=0; //cout<<"hi1"<<endl; }else { wz=i; over=i; } } } if(wz!=-1) { if(s[wz+1]=='+'||s[wz+1]=='-') { wz++; } for(int i=wz+1;i<s.size();i++) { if(s[i]<'0'||s[i]>'9') { flag=0; //cout<<"hi2"<<endl; } } } } if(flag==1) { int i=0; if(s[i]=='+'||s[i]=='-') { i=1; } int t=i; for(;i<over;i++) { if(p_c==1 && s[i]=='.'&& i<(over-1) && i>t) { continue; } if(s[i]<'0'||s[i]>'9') { //cout<<"hi3"<<endl; flag=0; break; } } } cout<<s; if (flag) cout<<" is legal.\n"; else cout<<" is illegal.\n"; } return 0; }
- 1
信息
- ID
- 538
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者