[模拟] Jzoj P5820 非法输入

Description

在算法竞赛中,题目一般保证了输入数据的合法性。然而在工程开发中,我们往往不期望程 序得到的输入都是合法的。
D 君正忙着向校内 OJ 添加题目,在写了第 233 个 val.cpp 之后,她的头脑中涌现出了这样 的想法。于是她决定出一道不需要写 val.cpp 的题。
输入两个整数,你需要做的就是输出她们的和。
 

Input

第一行一个正整数 T。
接下来 T 行,每行代表一组数据。
一组合法的数据包含由一个空格隔开的两个合法的十进制整数,行首和行尾不包含任何多余 的字符。
一个合法的十进制整数要么是 0,要么由一个可选的负号,一个 1 到 9 之间的数字,和若干 个 0 到 9 之间的数字顺序连接而成,并且这两个数字均在区间 [−2^31 , 2^31) 之内。
一组不合法的数据是一个不匹配以上规则的字符串。

Output

对于每组数据,如果该数据是合法的请输出一行一个整数代表答案,否则请输出 Input Error。
 

Sample Input

6
1 1
-1 -1
1        1
asdf

2147483648 0

Sample Output

2
-2
Input Error
Input Error
Input Error
Input Error
 

Data Constraint

 

 

 

题解

  • 模拟题,不过细节多多,这是道搞定输入就搞定的题目

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 long long t,len,zf,l,o,k,start;
 6 long long a,b,res,inf=2147483648;
 7 string s;
 8 bool pd(char c) { return c>='0'&&c<='9'; }
 9 int main()
10 {
11     freopen("aplusb.in","r",stdin);
12     freopen("aplusb.out","w",stdout);
13     scanf("%lld\n",&t);
14     for (long long i=1;i<=t;i++)
15     {
16         getline(cin,s);
17         len=s.length();
18         if (len==0) 
19         {
20             printf("Input Error\n");
21             continue;
22         }
23         a=0,b=0,zf=0,res=0,l=0,o=0,k=0,start=0;
24         if (s[0]=='-') zf=1,k++;
25         else 
26             if (!pd(s[0]))
27             {
28                 printf("Input Error\n");
29                 continue;
30             }
31         for (;k<len;k++)
32         {
33             if (!pd(s[k]))
34             {
35                 if (s[k]==' ') break;
36                 o=1;
37                 break;
38             }
39             if (!start)
40             {
41                 if (s[k]=='0') l++;
42                 else start=1;
43             }
44             res=res*10+s[k]-'0';
45             if ((!zf&&res>=inf)||(zf&&res<-inf))
46             {
47                 o=1;
48                 break;
49             }
50         }
51         if (zf) res=-res;
52         if (o||k==0||k>=len-1||(zf&&res==0)||l>1||(l&&res))
53         {
54             printf("Input Error\n");
55             continue;
56         }
57         a=res;
58         zf=0,res=0,l=0,o=0,start=0,k++;
59         if (s[k]=='-') zf=1,k++;
60         for (;k<len;k++)
61         {
62             if (!pd(s[k]))
63             {
64                 o=1;
65                 break;
66             }
67             if (!start)
68             {
69                 if (s[k]=='0') l++;
70                 else start=1;
71             }
72             res=res*10+s[k]-'0';
73             if ((!zf&&res>=inf)||(zf&&res<-inf))
74             {
75                 o=1;
76                 break;
77             }
78         }
79         if (zf) res=-res;
80         if (o||(zf&&res==0)||l>1||(l&&res))
81         {
82             printf("Input Error\n");
83             continue;
84         }
85         b=res;
86         printf("%lld\n",a+b);
87     }
88     return 0;
89 }

 

posted @ 2018-08-17 19:03  BEYang_Z  阅读(153)  评论(0编辑  收藏  举报