牛客小白月赛22-J 计算A+B(大整数加法)

链接:https://ac.nowcoder.com/acm/problem/202511
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

在一行中给出一个字符串,请判断是否满足A + B格式,如果满足,输出计算结果,否则输出"skipped"。
此处A,B均为大于等于0的整数,不保证数据没有前导零。

输入描述:

第一行输入一个n, 1 ≤ n < 1000n,1≤n≤1000,代表测试数据的组数。
接下来n行,每行输入一个长度不超过10000的字符串。

输出描述:

对于每组输入,输出结果

示例1

输入
4
2+2
1+2
+12
0+0
输出
4
3
skipped
0
这道题是牛客月赛的题,题意非常好理解,判断输入的字符串是否满足A+B的格式,如果符合的话输出结果,如果不符合输出“skipped”,考虑到字符串是10000位的,所以用到大整数加法,思路是先定义n,然后进入while循环,输入我们的字符串,这里用一个flag来存储加号的位置,如果找不到加号说明不符合题意,直接输出skipped,如果能找到加号,则通过加号把字符串一分为二,然后得到的这两个数相加,当然,如果其中有一个字符串为空,也就是+12或12+这种格式,说明不符合题意,也应该输出skipped,记得判断一下,分好字符串以后进行大整数加法,因为没有前导零这种情况,所以我们不用考虑。贴AC代码

#include 
using namespace std;
const int _max=1e4+50;
int main()
{
	int n;
	cin>>n;
	string f(string,string);
	while(n--)
	{
		string s;
		cin>>s;
		int flag=-1;//找加号的位置
		for(int i=0;i<s.length();i++)
		  if(s[i]=='+')
		  {
		  	flag=i;
		  	break;
		  }
		if(flag==-1)//找不到加号说明不符合题意
		{
			cout<<"skipped"<<endl;
			continue;
		}
		string a="",b="";//一分为二的字符串
		a=s.substr(0,flag);//加号之前的
		b=s.substr(flag+1,s.length());//加号之后的
		if(a.empty()||b.empty())//判断一下字符串是否为空串
		{
			cout<<"skipped"<<endl;
			continue;
		}
		cout<<f(a,b)<<endl;//大整数加法
	}
	return 0;
}
string f(string a,string b)
{
	int c1,c2;
	c1=a.length();
	c2=b.length();
	if(c1>c2)//先在前端补0让两个串一样长
	{
		for(int i=c2;i<c1;i++)
		  b='0'+b;
	}
	else
	{
		for(int i=c1;i<c2;i++)
		  a='0'+a;
	}
	string ans="";//存放答案
	int s,v=0;//s表示当前位,v表示应该进的位
	int c=a.length();
	for(int i=c-1;i>=0;i--)//从后往前计算
	{
		s=a[i]-'0'+b[i]-'0'+v;
		v=s/10;//计算要进的位
		s%=10;//当前位应该小于10
		ans=char(s+'0')+ans;//从后往前加
	}
	if(v!=0)//最后判断一下要不要进位
	  ans=char(v+'0')+ans;
	return ans;  
}

你可能感兴趣的:(c++)