L1-025 正整数A+B (15 分)团体程序设计天梯赛-练习集-ExtraGuoX

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,有空下次再见在这里插入图片描述

发布了6 篇原创文章 · 获赞 1 · 访问量 561

猜你喜欢

转载自blog.csdn.net/qq_42482358/article/details/88826592
今日推荐