2019杭電多校第七場1001:A + B = C

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章