`

fzu 2065 数字判别(模拟题)

阅读更多


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;
}
 
0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics