PTA L1-025 正整数A+B
题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:
输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。
输出格式:
如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。
输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
22. 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla...33
输出样例3:
? + ? = ?
题目说很简单,信你个鬼了!这道题非常非常非常考验你的细心程度:
主要有三个难点:
1.第一个空格的位置
2.当A或B有值为0时
3.当A或B有值大于1000时
#include<string.h>
#include<iostream>
#include<cmath>
using namespace std;
int judge(char s)//判断字符是否符合规范
{
if (s<'0' || s>'9') return 0;
else return 1;
}
int main()
{
char s[10000];
int i, k = 0, m = 0, n = 0;
bool flag1 = 1, flag2 = 1;//判断A与B是否符合规范
cin.getline(s, 1000);
for (i = 0; i < strlen(s); i++)
{
if (s[i] == ' ') { break; }
k++;
}//k分割字符串
for (i = 0; i < k; i++)
{
flag1 = judge(s[i]);
if (flag1==0)
{ break; }
}//判断A字符串
for (i = k + 1; i < strlen(s); i++)
{
flag2 = judge(s[i]);
if (!flag2) { break; }
}//判断B字符串
if ((k > 4) || (k == 4 && s[k-1]!= '0')) { flag1 = 0; }
if ((strlen(s) - k - 1 > 4) || ((strlen(s) - k - 1 == 4) && (s[strlen(s) - 1] != '0'))) { flag2 = 0; }//判断A与B是否大于1000,这个小问题导致一个样例怎么也通不过,所以一定要细心
if (s[0] == '0') flag1 = 0;
if (s[k + 1] == '0') flag2 = 0;//判断A与B是否为0
if (!flag1 && !flag2) cout << "? + ? = ?";
else if (flag1 && !flag2)
{
for (i = 0; i < k; i++)
{
cout << s[i];
}
cout << " + ? = ?";
}
else if (!flag1 && flag2)
{
cout << "? + ";
for (i = k + 1; i < strlen(s); i++)
{
cout << s[i];
}
cout << " = ?";
}
else //若A与B都符合规范,则计算和
{
for (i = 0; i < k; i++)
{
m += pow(10, k - i - 1)*(s[i] - '0');
cout << s[i];
}
cout << " + ";
for (i = k + 1; i < strlen(s); i++)
{
n = n + pow(10, strlen(s) - i - 1)*(s[i] - '0');
cout << s[i];
}
cout << " = " << m + n;
}
}