链接:https://ac.nowcoder.com/acm/contest/9667/E
题目
牛牛经常在数学课上睡觉,所以他的数学非常烂。
别人的数学都是进位加法, 但是他的却是非进位加法,比如 7+7 = 4, 22+84 = 6
现在牛牛想考验你一下, 给你两个非常大的数,计算他们的和。
输入
第一行一个整数 a ( a ≥ 0 and |a| ≤ 2e5);
第二行一个整数 b ( b ≥ 0 and |b| ≤ 2e5);
输出
输出一个数 c , c = a + b
思路
状态不佳,在最后半小时才看这个题的,跟A怼上了,问题有点大。
这个题首先值得注意的是数据范围:
第一行一个整数 a ( a ≥ 0 and |a| ≤ 2e5);
第二行一个整数 b ( b ≥ 0 and |b| ≤ 2e5);
请注意,这里的绝对值号的意思,其实是指a,b的长度,所以开long long的可以拉出去枪毙了(●’◡’●)。
所以这里我想到的是用string存储。
string a,b;
cin>>a>>b;
那么我们再来看这个RZ的牛牛是怎么计算的:
7+7=4
22+84=6
按照正常的思路,7+7=14,22+84=106。我们把两个放在一起看一下会发现:
第一个式子里,(7+7)%10=4,这就得到了RZ人的答案;
第二个式子里,个位上(4+2)%10=6,十位上(2+8)%10=0,由于是前缀0被省略了,所以答案是6。
心机子娃一直摸你肚子,真相就是:’
牛牛眼里的两个数相加,其实是个位对齐之后每个位置相加再对10取余,然后输出这个结果!
知道这个之后还要考虑两个点:前缀0和全是0(例如88+22)。
这两个如此简单,相信聪明的你一定能够想出解决方案,我们直接看代码。
「伊丽莎白」!
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
string a,b;
string ss;
int n,m;
cin>>a>>b;
int len1=a.size()-1,len2=b.size()-1;
while(len1>=0||len2>=0) //考虑三种情况:10001+99,99+99,12+11122
{
if(len1<0)
n=0;
else
n=a[len1]-'0';
if(len2<0)
m=0;
else
m=b[len2]-'0';
int ans=(n+m)%10;
ss+=(ans+'0');
len1--,len2--;
}
//ss中存储的数其实是倒序的
//比如111+123,ss中就会是:432,答案应该是234
//自己可以根据喜好调整
int k=-1;
for(int i=ss.size()-1; i>=0; i--) //找前缀0,找到第一个不为0的位置,从那个位置开始输出
{
if(ss[i]!='0')
{
k=i;
break;
}
}
if(k==-1) //k=-1说明全是0,输出一个就好
cout<<0<<endl;
else
{
for(int i=k;i>=0;i--)
cout<<ss[i]-'0';
cout<<endl;
}
}
我其实还好(T_T)