A + B = C
題意:
給定 a b c 求出 x y z 使得 a * 10^x + b * 10^y = c * 10 ^z 。
思路:
a + b = c,要麼a+b有進位,要麼沒有進位。那麼判斷題目是否有解只要判斷 b | ( c - a ) (|)是整除符號。 b | ( c*10 - a ) ,
a | ( c*10 - b ) , a | ( c - b ) 四種情況。
借鑑自博客:https://blog.csdn.net/qq_41117236/article/details/99329687
代碼:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,lim=1e5+10;
int a[N],b[N],c[N],d[N];
char A[N],B[N],C[N];
int check(int a[],int la,int b[],int lb,int c[],int lc){
int i;
for(i=0;i<lim;i++){
if(c[i]!=a[i]){
if(c[i]<a[i])
return -1;
break;
}
}
for(i=0;i<lim;i++)
d[i]=c[i]-a[i];
for(i=lim-1;i>=0;i--){
if(d[i]<0)
d[i-1]--,d[i]+=10;
}
int t=0;
while(!d[t]&&t<lim)
t++;
if(t==lim)
return -1;
for(i=0;i<lb;i++)
if(d[t+i]!=b[i])
return -1;
for(i=lb;i<lim;i++)
if(d[t+i])
return -1;
return lim-lb-t;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%s%s%s",A+1,B+1,C+1);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int la=strlen(A+1),lb=strlen(B+1),lc=strlen(C+1);
for(int i=1;i<=la;i++)
a[i]=A[i]-'0';
for(int i=1;i<=lb;i++)
b[i]=B[i]-'0';
for(int i=1;i<=lc;i++)
c[i]=C[i]-'0';
int t;
if((t=check(a+1,la,b+1,lb,c+1,lc))!=-1){
printf("%d %d %d\n",lim-la,t,lim-lc);
continue;
}
if((t=check(a,la+1,b+1,lb,c+1,lc))!=-1){
printf("%d %d %d\n",lim-la-1,t,lim-lc);
continue;
}
if((t=check(b+1,lb,a+1,la,c+1,lc))!=-1){
printf("%d %d %d\n",t,lim-lb,lim-lc);
continue;
}
if((t=check(b,lb+1,a+1,la,c+1,lc))!=-1){
printf("%d %d %d\n",t,lim-lb-1,lim-lc);
continue;
}
puts("-1");
}
return 0;
}