L1-025 正整数A+B (15 分)
题的目标很简单,就是求两个正整数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.对char数组的操作:char数组转int数值的手工模拟
2.各种细小到恶心的点
(1)数字要1到1000的正整数
(2)用第一个出现的空格用来判断A和B,但没说A是否存在,也就是说A是可以不存在的
(3)接上一点,第一个空格用来判断,也就是说第一个空格以后的全部都是B
(4)A和B不能出现除数字外的任何东西,包括空格
3.控制住自己不要砸桌子
#include <iostream>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
char a[10005];//读入数据a
char s1[15],s2[15];//char数组代表的A和B
int cnt1=0,cnt2=0;//A,B的长度
int A,B;//A,B的值
int f(char x[],int cnt)//char数组转int函数
{
int sum=0;//转int的最后返回值
int quan=1;//每一位的权值
if(cnt==0 || cnt>4)return inf;//没有值或者大于4位直接return(因为是1到1000嘛)
for(int i=0;i<cnt;i++)
{
if(x[i]>='0' && x[i]<='9')
{
//从个位开始,累乘10,这是char数组转int的关键代码
sum+=quan*(x[cnt-i-1]-'0');
quan*=10;
}
else return inf;//只要出现非数字就return
}
if(sum<1 || sum>1000) return inf;
return sum;
}
int main()
{
scanf("%[^\n]",a);//读入一行
getchar();//吃回车
int flag=1;//判断第一个空格
for(int i=0;i<strlen(a);i++)
{
if(flag)
{
if(a[i]==' ')flag=0;//第一个空格是表示A还是B
else s1[cnt1++]=a[i];
}
else
{
s2[cnt2++]=a[i];
}
}
//只要返回inf,你就是错误的
A=f(s1,cnt1);
B=f(s2,cnt2);
if(A==inf && B==inf)
printf("? + ? = ?");
if(A!=inf && B==inf)
printf("%d + ? = ?",A);
if(A==inf && B!=inf)
printf("? + %d = ?",B);
if(A!=inf && B!=inf)
{
int c=A+B;
printf("%d + %d = %d",A,B,c);
}
}
我是Acmer菜鸡GuoX,有空下次再见