牛客小白月赛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 <bits/stdc++.h>
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;
}