PTA L1-025正整数A+B
- 难点
此题说难难,说不难又难,不难在于其算法思想非常简单。难在考虑特殊情况的细致程度要求很高,一般不会让你一次性AC,总有那么几个点会卡你几下,除非你是一个非常细致的人。以下列出一些特殊情况:
1.有0出现,你需要判为?
2.有大于1000的数字出现,你需要判为?
3.这是本题最难的点,A可以为空串!
对于第3个点,我们要如何处理呢?我们首先要选择好的方法,此题一般解法是定义两个字符串来处理,如果是这样,那么处理第3个难点会变得困难而且复杂,所以好的方法很重要。与其判定两个串,倒不如一次性判定一个串,而且题目已经给出两个串的界线——第一个碰到的空格,既然如此,何不利用一发?C++语言提供了可以接受字符串的语句getline,用它接受一个串,寻找第一个碰到的空格,往前判定A,往后判定B,如果第一个字符为空格,那么A需要判为?
作者:qq_37729102
来源:优快云
原文:https://blog.youkuaiyun.com/qq_37729102/article/details/80716264
#include<iostream>
#include<string>
using namespace std;
int main()
{
string S;
int flagA = 0, flagB = 0;
getline(cin,S);//使用getline来接收包括空格在内的字符
int sumA = 0, sumB = 0, Base;
for (int i =0; i <S.length(); i++)
{
if(S[i]==' ')//碰到第一个空格
{
Base = 1;//初始化
for(int j=i-1;j>=0;j--)//计算A,注意j的范围从前一个字符到0
{
if (S[j]<'0' || S[j]>'9')//如果字符不为数字
{
flagA = 1;
break;//标识,退出
}
else
{
sumA += Base*(S[j] - '0');//如果为数字,累加
Base *= 10;
}
if(i==0)//如果第一个字符是空格
{
flagA=1;
break;//标识,退出
}
}
if (sumA>1000||sumA==0)//如果累加和不在0到1000范围内
flagA = 1;
Base = 1;//注意重新初始化
for(int j=S.length()-1;j>i;j--)//计算B,注意j的范围从最后一个字符到i+1
{
if (S[j]<'0' || S[j]>'9')
{
flagB = 1;
break;
}
else
{
sumB += Base*(S[j] - '0');
Base *= 10;
}
}
if (sumB>1000||sumB==0)
flagB = 1;
break;//注意及时跳出大循环
}
}
if (flagA)
{
if (flagB)
cout << "? + ? = ?";
else
cout << "? + " << sumB << " = ?";
}
else
{
if (!flagB)
cout << sumA << " + " << sumB << " = " << sumA + sumB;
else
cout << sumA << " + ? = ?";
}
return 0;
}