题目大意:
给定a,b,c求x,y,z
题目思路:
可以分为三种情况来考虑。先把全部末尾的0都去掉,再统一反转字符串,方便随后的加减模拟运算。
情况1:c最低的非零位由两者相加得来
这种情况我们模拟a+b得到的结果看是否非零部分和c的非零部分一样,然后一定要只比较非0部分 这样可以直接包含5+5=10的情况
情况2:c的最低非0位由a自己贡献
这种情况相加的话不容易确定b的位置,或者说很麻烦确定,(队友哈希直接AC),考虑减法,直接减去a,看下得到的数是否非0部分和b的一样。
情况3:c的最低非零为由b自己贡献
这种情况也同样不容易确定a的位置,同情况2处理。
模拟的话,头脑要保持清醒,需要什么就处理什么,尽量封装,打一部分就快速验证是否正确,一定要一气呵成,不能断片
#include
using namespace std;
#define LL long long
const LL MAXN = 1e6 + 5;
const LL mod = 1e6;
char a[MAXN],b[MAXN],c[MAXN];
char aa[MAXN],bb[MAXN],cc[MAXN];
char dd[MAXN],ee[MAXN],ff[MAXN];
LL len_a,len_b,len_c; ///a,b,c长度
LL num_a,num_b,num_c; ///尾0数量
LL idx_a,idx_b,idx_c; ///非0位置
LL lin[MAXN];
LL mul(char x[],char y[],LL l1,LL l2) ///大数加法临时结果存入lin数组
{
for(LL i=0;i<=max(l1,l2)+10;i++){
lin[i]=0;
}
LL l3=max(l1,l2)+1;
for(LL i=0;i=10){
lin[i]-=10;lin[i+1]++;
}
}
if(lin[l3]!=0)l3++;
return l3;
}
LL dec(char x[],char y[],LL l1,LL l2) ///大数减法临时结果存入lin数组
{
if(l1=0;i--){
if(aa[i]!='0'){
idx_a=i;break;
}
else num_a++;
}
for(LL i=len_b-1;i>=0;i--){
if(bb[i]!='0'){
idx_b=i;break;
}
else num_b++;
}
for(LL i=len_c-1;i>=0;i--){
if(cc[i]!='0'){
idx_c=i;break;
}
else num_c++;
}
reverse(aa,aa+idx_a+1);reverse(bb,bb+idx_b+1);reverse(cc,cc+idx_c+1);
/*********a + b = c 最低位由两个相加得来*********/
if((cc[0]!=aa[0]&&cc[0]!=bb[0])||(aa[0]-'0'+bb[0]-'0'==10)){
LL ll3 = mul(aa,bb,idx_a,idx_b);
bool f=1;
LL index,num=0;
for(LL i=0;i