现在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
第一行一个整数T(1<T<=100000),表示有T组数据。
每组数据一行由数字字母正负号以及小数点组成的字符串,长度不大于10,其中没有空格。
#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; }?