Problem 2065 数字判别
Accept: 31 Submit: 81
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
现在kk 给你K-number的定义和一些字符串,想请你判断一下他们是否是K-number。
现在我们用digit表示一串连续的数字,中间没有任何符号。E或e表是指数。
那么数字就可以表示成:
K-number = digit
K-number = .digit
K-number = digit.
K-number = digit.digit
K-number = digit e/E digit
K-number = digit e/E +/- digit
K-number = .digit e/E digit
K-number = .digit e/E +/- digit
K-number = digit. e/E digit
K-number = digit. e/E +/- digit
K-number = digit.digit e/E digit
K-number = digit.digit e/E +/- digit
Input
第一行一个整数T(1<T<=100000),表示有T组数据。
每组数据一行由数字字母正负号以及小数点组成的字符串,长度不大于10,其中没有空格。
Output
对于每组数据,如果是K-number则输出该字符串否则不输出。
Sample Input
2
123sd
33.E456
Sample Output
33.E456
题目大意:就是判断它是否是数字。上面有数字的表示形式的提示,然后就照着它模拟。又是一道模拟题,继续模拟模拟吧。下面有详细注释,不多说。
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
using namespace std;
char str[15];
bool judge()
{
int i, len;
int dot_pos, e_pos, s_pos;
bool b_dot, l_dot, e_flag, s_flag, num_flag;
char ch[15];
strcpy(ch, str);
len = strlen(ch);
for(i = 0; i < len; i++)
{
if( !(ch[i] >= '0' && ch[i] <= '9'
|| ch[i] == '.'
|| ch[i] == 'e' || ch[i] == 'E'
|| ch[i] == '+' || ch[i] == '-') ) return false;
/// 有不合法字符
}
b_dot = l_dot = false;
e_flag = s_flag = false;
num_flag = false;
if(ch[0] == '.') /// 有前置'.'
{
b_dot = true;
for(i = 1; i < len; i++) ///则将'0'去掉
{
ch[i-1] = ch[i];
}
ch[len-1] = 0;
}
len = strlen(ch);
if(len == 0) return false; ///'.'是不合法的
for(i = 0; i < len; i++)
{
if(ch[i] == '.')
{
dot_pos = i;
l_dot = true;
break;
}
}
if(b_dot && l_dot) return false; /// 有两个'.'
if(l_dot) /// 有后置的'.'
{
for(i = 0; i < dot_pos; i++) ///后置'.'之前的都是数字
{
if( !(ch[i] >= '0' && ch[i] <= '9') ) return false;
}
for(i = dot_pos + 1; i < len; i++) ///判断后置'.'之后的
{
if(ch[i] == '+' || ch[i] == '-' || ch[i] == '.') return false;
if(ch[i] == 'e' || ch[i] == 'E')
{
e_flag = true;
e_pos = i;
break;
}
}
}
else /// 没有后置'.'
{
for(i = 0; i < len; i++) /// 则后面 全部是数字 或 有e
{
if( !(ch[i] >= '0' && ch[i] <= '9') && !num_flag) return false;
if(ch[i] >= '0' && ch[i] <= '9') num_flag = true;
if(ch[i] == '+' || ch[i] == '-') return false;
if(ch[i] == 'e' || ch[i] == 'E')
{
e_flag = true;
e_pos = i;
break;
}
}
}
if(e_flag) /// 后面有e
{
if(e_pos + 1 >= len) return false; /// 以e/E结束,错误
/// 判断是否有+符号
if(ch[e_pos+1] == '+' || ch[e_pos+1] == '-')
{
s_flag = true;
s_pos = e_pos + 1;
}
else s_pos = e_pos;
if(s_flag) /// 有+符号
{
if(s_pos + 1 >= len) return false; /// 以符号结束,错误
for(i = s_pos + 1; i < len; i++)
{
/// +符号后面只有数字,若不是则错误
if( !(ch[i] >= '0' && ch[i] <= '9') ) return false;
}
}
else /// 没有+符号
{
for(i = s_pos + 1; i < len; i++)
{
if( !(ch[i] >= '0' && ch[i] <= '9') ) return false;
}
}
}
return true;
}
int main()
{
int t;
scanf("%d", &t);
getchar();
while(t--)
{
scanf("%s", str);
if(judge()) printf("%s\n", str);
}
return 0;
}
分享到:
相关推荐
求最大乘积 的源代码 次题是fzu 4月月赛题 是一道数学题啊
fzu online judge 的几道题,我的解题过程与思路,虽然都是很easy的题目,不过,重在参与嘛,哈哈
2021FZU计算机视觉作业(九)
2021FZU计算机视觉作业(七)
2021FZU计算机视觉作业(八)
2021FZU计算机视觉期末复习
不要下载此版的,请下载最新的http://download.csdn.net/source/1664620 离线版的福大acm在线评测OJ系统题目 更新到2009年8月 (注:chm电子书格式化)
fzu大数据基础实验4
C#miniword完整版,FZU作业,MINIWORD
FZU软件工程web课程复习资料-整理
FZU2021计算机视觉慕课答案(一)
FZU软件工程操作系统课程复习资料-整理
FZU2021计算机视觉答案(三)
FZU2021计算机视觉答案(四)
2021FZU计算机视觉答案(五)
2021FZU计算机视觉答案(二 )
2021FZU计算机视觉答案(六)
这是关于我们飞跃手册项目的相关文档,包括成员分组信息表格,各组成员任务概要文档,项目日记等文档。 (This is a collection of documents relating to our Leapfrog Handbook project, including member ...
2011 ACM 多校联合 2011 MU11 13 FZU
ACM数学_FZU...............绝密..........