相当于一道模拟题吧。纠结死我了、、各种WA各种不爽。。好多情况要考虑。。自己的思维全面性,以及编码能力还是不够啊。。。最重要的一点就是要静下心来。。。不能浮躁。。。
1:整个浮点数前后的空格不考虑,开始我考虑在内了所以WA了很多次。。
2:分三中情况
a: 只有小数点,无e(E)...
b:只有e(E),无小数点。。
c:既有小数点,又有e(E)..
View Code
#include#include #include using namespace std; #define maxn 300 char str[maxn]; int main() { int i,len; int dn,en,td,te; int s; while (gets(str) != NULL) { dn = en = 0;//初始化,dn记录小数点的个数,en记录e的格式 td = te = s = 0;//s记录初始位置,td,te,分别记录小数点以及e的位置 len = strlen(str); //把前后的空格清理一下 while (str[s] == ' ') s++; while (str[len - 1] == ' ') len--; for (i = 0; i < len; ++i)//统计小数点以及e的个数 { if (str[i] == '.') { dn++; td = i; } if (str[i] == 'E' || str[i] == 'e') { en++; te = i; } } if ((dn > 1 || en > 1) || (dn == 0 && en == 0))//如果小数点以及e的个数存在大于1的或者都小于0 { printf("NO\n"); continue; } //只存在小数点,无e的情况 else if (dn == 1 && en == 0) { if (str[s] != '+' && str[s] != '-' && !(str[s] >= '0' && str[s] <= '9'))//第一位如果不满足直接输出NO { printf("NO\n"); continue; } if (!(str[td - 1] >= '0' && str[td - 1] <= '9') || td - 1 < s)//对紧靠小数点左边的以为检查 { printf("NO\n"); continue; } bool flag = false; for (i = s + 1; i < td; ++i)//对小数点左边的所有情况进行检查 { if (!(str[i] >= '0' && str[i] <= '9')) { flag = true; break; } } if (flag) { printf("NO\n"); continue; } if (td + 1 >= len)//对紧靠小数点右边的那一点检查 { printf("NO\n"); continue; } flag = false; for (i = td + 1; i < len; ++i)//对小数点右边的所有数检查 { if (!(str[i] >= '0' && str[i] <= '9')) { flag = true; break; } } if (flag) { printf("NO\n"); continue; } else { printf("YES\n"); continue; } } //只有e而没有小数点的情况 else if (dn == 0 && en == 1) { if (str[s] != '+' && str[s] != '-' && !(str[s] >= '0' && str[s] <= '9'))//第一位如果不满足直接输出NO { printf("NO\n"); continue; } if (!(str[te - 1] >= '0' && str[te - 1] <= '9') || te - 1 < s)//对紧靠e左边的一位进行检查 { printf("NO\n"); continue; } bool flag = false; for (i = s + 1; i < te; ++i)//对e左边的所有数检查 { if (!(str[i] >= '0' && str[i] <= '9')) { break; flag = true; } } if (flag) { printf("NO\n"); continue; } flag = false; for (i = te + 1; i < len; ++i)//对e后边的所有情况进行检查 { if (i == te + 1 && (str[i] == '+' || str[i] == '-')) continue; if (!(str[i] >= '0' && str[i] <= '9')) { flag = true; break; } } if (flag) { printf("NO\n"); continue; } else { if (te + 1 >= len || !(str[len - 1] >= '0' && str[len - 1] <= '9')) printf("NO\n"); else printf("YES\n"); continue; } } //。与e都有 else if(dn == 1 && en == 1) { if (str[s] != '+' && str[s] != '-' && !(str[s] >= '0' && str[s] <= '9'))//开头检查 { printf("NO\n"); continue; } if (!(str[td - 1] >= '0' && str[td - 1] <= '9') || td - 1 < s)//对紧靠.左边的一位进行检查 { printf("NO\n"); continue; } bool flag = false; for (i = s + 1; i < td; ++i)//对.左边的所有情况进行检查 { if (!(str[i] >= '0' && str[i] <= '9')) { flag = true; break; } } if (flag) { printf("NO\n"); continue; } if (td + 1 >= te) { printf("NO\n"); continue; } flag = false; for (i = td + 1; i < te; ++i)//对.与e之间进行检查 { if (!(str[i] >= '0' && str[i] <= '9')) { flag = true; break; } } if (flag) { printf("NO\n"); continue; } flag = false; for (i = te + 1; i < len; ++i)//对e后面的所有情况进行检查 { if (i == te + 1 && (str[i] == '+' || str[i] == '-')) continue; if (!(str[i] >= '0' && str[i] <= '9')) { flag = true; break; } } if (flag) { printf("NO\n"); continue; } else { if (te + 1 >= len || !(str[len - 1] >= '0' && str[len - 1] <= '9')) printf("NO\n"); else printf("YES\n"); continue; } } } }