http://acm.sdut.edu.cn/web/showproblem.php?pid=2098&cid=1088
意思就不用说了,都是汉语,都能看的懂。真是纠结了好几天,本来是A了的,可是后台数据一完善后,我的程序真是毛病百出了。重写这道题目!!!
下面 说一下判断字符串不合法的情况
由于是好几天才A掉的,所以中间思路可能有些乱
1. 从字符串第一个不是空格的地方开始,到字符串最后不为空格的地方。如果中间有空格出现,则是非法的
2.如果字符串里没有“.”,也没有"e",也没有"E",则是非法的,如果有任何一个,则其个数不能超过1个,并且“e”和“E”不能同时出现
3.如果字符串中"+"和"-"的个数多余两个,则是非法的
4.如果“.”两边的字符不是数字,则是非法的
5.如果“e“ 或是“E”的前面那个字符不是数字,则是非法的
6.判断字符串第一个不是空格的字符和最后一个不是空格的字符是不是合法,代码里有注释,这里就不多写了
7.判断字符串里是不是有非法的字符,所谓非法就是:不是“e”,也不是“E”,也不是数字,也不是“+",也不是“-”,也不是“.”
8.如果字符串里出现了两个“+”或是两个“-”时,要判断第一个的位置的合法性,还要判断第二个出现的位置的合法性,代码里有注释。
提供一些样例
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 using namespace std;
5 #define N 300
6 char str[N],sbr[N];
7 struct node
8 {
9 int index[10];
10 int num;
11 }flag[10];
12 int main()
13 {
14 int i;
15 while(gets(sbr))
16 {
17 int j,l,t,h,k;
18 memset(flag,0,sizeof(flag));
19 int len1=strlen(sbr);
20 int m,kkk=0;
21 m=0;
22 for(i=len1-1;i>=0;i--) // 去除末尾的空格
23 {
24 if(sbr[i]!=' ')break;
25 }
26 sbr[i+1]='\0';
27 len1=strlen(sbr); // 重新求长度
28 for(i=0;i<len1;i++) // 查找第一个不是空格的位置
29 {
30 if(sbr[i]!=' ') break;
31 }
32 for(j=i;j<len1;j++) //如果字符串中间有空格 NO
33 {
34 if(sbr[j]==' ')
35 {
36 cout<<"NO\n";kkk=1;break;
37 }
38 }
39
40 if(kkk) continue;
41 for(i=0;i<len1;i++) // 将字符串重新复制到一个字符数组里
42 {
43 if(sbr[i]!=' ') str[m++]=sbr[i];
44 }
45 str[m]='\0';
46 int len=strlen(str); // 求长度
47 //cout<<m<<endl;
48 kkk=0;
49 for(i=0;i<len;i++) // 判断字符串内的字符是否合法
50 {
51 if(str[i]!='.'&&str[i]!='e'&&str[i]!='E'&&str[i]!='+'&&str[i]!='-'&&!(str[i]<='9'&&str[i]>='0'))
52 {
53 cout<<"NO\n";kkk=1;break;
54 }
55 }
56 if(kkk) continue;
57 kkk=0;
58 for(i=0;i<len;i++) // 判断e或E 后面是否还有小数点
59 {
60 if(str[i]=='e'||str[i]=='E')
61 {
62 for(j=i;j<len;j++)
63 if(str[j]=='.')
64 {
65 cout<<"NO\n"; kkk=1;break;
66 }
67 }
68 if(kkk) break;
69 }
70 if(kkk) continue;
71 if((!(str[0]<='9'&&str[0]>='0')&&str[0]!='-'&&str[0]!='+')||!(str[len-1]>='0'&&str[len-1]<='9')) // 判断第一个位置和最后一个位置是否合法
72 {
73 cout<<"NO\n";
74 continue;
75 }
76 j=l=t=h=k=0;
77 for(i=0;i<len;i++) // 统计这些字符出现的个数,以及他们出现的位置
78 {
79 switch(str[i])
80 {
81 case '+':flag[0].index[j++]=i;
82 flag[0].num++;break;
83 case '-':flag[1].index[l++]=i;
84 flag[1].num++;break;
85 case 'e':flag[2].index[t++]=i;
86 flag[2].num++;break;
87 case 'E':flag[3].index[h++]=i;
88 flag[3].num++;break;
89 case '.':flag[4].index[k++]=i;
90 flag[4].num++;break;
91 }
92 }
93 if(flag[2].num) //判断e出现的前面那个字符是不是数字
94 {
95 if(!(str[flag[2].index[0]-1]>='0'&&str[flag[2].index[0]-1]<='9'))
96 {
97 cout<<"NO\n";continue;
98 }
99 }
100 if(flag[3].num) // 判断e出现的前面那个字符是不是数字 昨天晚上一直过不了就是因为这里没有判断
101 {
102 if(!(str[flag[3].index[0]-1]>='0'&&str[flag[3].index[0]-1]<='9'))
103 {
104 cout<<"NO\n";continue;
105 }
106 }
107 if(flag[2].num==1&&flag[3].num==1) // 如果字符串里既有e又有E,则是非法的
108 {
109 cout<<"NO\n";continue;
110 }
111 if(!flag[2].num && !flag[4].num && !flag[3].num) // 如果没有小数点,也没有e,也没有E 则是非法的
112 {
113 cout<<"NO\n";continue;
114 }
115 if(flag[0].num>2||flag[2].num>1||flag[3].num>1||flag[4].num>1||flag[1].num>2) // 判断他们各自的个数是否合法
116 {
117 cout<<"NO\n";continue;
118 }
119 if(flag[0].num==2&&(flag[0].index[0]!=0||(str[flag[0].index[1]-1]!='e'&&str[flag[0].index[1]-1]!='E'))) // 如果有两个"+",并且(第一个不在零位置或则第二个的前面不是e也不是E)非法
120 {
121 cout<<"NO\n";continue;
122 }
123 if(flag[1].num==2&&(flag[1].index[0]!=0||(str[flag[1].index[1]-1]!='e'&&str[flag[1].index[1]-1]!='E'))) // 判断两个“-”的情况
124 {
125 cout<<"NO\n";continue;
126 }
127 int mark=0;
128 for(i=0;i<len;i++)
129 {
130
131 if(str[i]=='.') // 判断小数点的两边是否都为数字
132 {
133 //if(str[i+1]=='e'||str[i+1]=='E'||str[i+1]=='-'||!(str[i-1]>='0'&&str[i-1]<='9'))
134 if(!(str[i-1]>='0'&&str[i-1]<='9')||!(str[i+1]>='0'&&str[i+1]<='9'))
135 {
136 cout<<"NO\n";mark=1;break;
137 }
138 }
139 }
140 if(!mark) cout<<"YES\n";
141 }
142 return 0;
143 }