题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6646
题目大意: a*10^x + b*10^y = c*10^z 给a、b、c 求 x、y、z
a、b、c<10^100000 如果没有满足的x.y.z 输出-1
题解:
plana: 把a,b,c都末尾加0补到相同长度得到a0,b0,c0 末尾都去掉0得到a1,b1,c1
定义cmp( x,y )==1 为x和y的前半非零部分完全相同
这时只有四种情况
①cmp( c0-a0, b1) 即c0-a0 得到的部分,前半非0部分和b1相同
②cmp( c0*10-a0 , b1 ) 即c0乘10减a0,得到的部分前面非0部分和b1相同
③cmp( c0-b0, a1)
④cmp( c0*10-b0 , a1 )
都不满足就不存在
注意每一次a、b、c由字符串转为数字前都要把数字数组memset为0

1 #include<bits/stdc++.h>
2 using namespace std;
3 int const maxn=1e5+100;
4 char a[maxn],b[maxn],c[maxn];
5 int lena,lenb,lenc,tmpa,tmpb,tmpc,ansa,ansb,ansc,maxlen;
6 bool flag;
7 int an[maxn],bn[maxn],cn[maxn],adn[maxn];
8 void innum2(int aa[],char x[],int z,int tmp,int zer){//数字字符串x,去掉末尾0后为z位数,zer后面要补0的个数
9 //memset(aa,0,sizeof(aa));
10 aa[0]=z;
11 for(int i=1;i<=zer;i++)aa[i]=0;
12 for(int i=1;i<=aa[0];i++)
13 aa[i+zer]=x[aa[0]-i]-48;
14 aa[0]+=zer;
15 }
16 void jian(int a[],int b[]){
17 for(int i=a[0];i>0;i--)a[i]-=b[i];
18 for(int i=1;i<=a[0];i++)
19 if(a[i]<0){
20 a[i]+=10;
21 a[i+1]--;
22 }
23 while(a[a[0]]==0)a[0]--;
24 }
25 int maxme(int x,int y,int z){
26 if(x<y)swap(x,y);
27 if(x<z)swap(x,z);
28 return x;
29 }
30 int minme(int x,int y,int z){
31 if(x>y)swap(x,y);
32 if(x>z)swap(x,z);
33 return x;
34 }
35 void pushans(int x,int y,int z){
36 int v=minme(x,y,z);
37 if(v<0){ansa=x-v,ansb=y-v,ansc=z-v;}
38 else {ansa=x,ansb=y,ansc=z;}
39 flag=1;
40 }
41 bool cmp(int x[],int y[]){
42 if(x[0]<y[0])return 0;
43 bool vis3=1;
44 for(int i=0;i<y[0];i++){
45 if(y[y[0]-i]!=x[x[0]-i]){vis3=0;break;}
46 }
47 return vis3;
48 }
49 void work(){
50 memset(cn,0,sizeof cn);memset(an,0,sizeof an);memset(bn,0,sizeof bn);
51 innum2(cn,c,lenc,tmpc,maxlen-lenc);
52 innum2(an,a,lena,tmpa,maxlen-lena);
53 innum2(bn,b,lenb,tmpb,0);
54 jian(cn,an);
55 if(cmp(cn,bn)){
56 pushans(maxlen-lena-tmpa,cn[0]-lenb-tmpb,maxlen-lenc-tmpc);return ;
57 }
58 memset(cn,0,sizeof cn);
59 innum2(cn,c,lenc,tmpc,maxlen-lenc+1);
60 jian(cn,an);
61 if(cmp(cn,bn)){
62 pushans(maxlen-lena-tmpa,cn[0]-lenb-tmpb,maxlen-lenc+1-tmpc);return ;
63 }
64 memset(cn,0,sizeof cn);memset(an,0,sizeof an);memset(bn,0,sizeof bn);
65 innum2(cn,c,lenc,tmpc,maxlen-lenc);
66 innum2(bn,b,lenb,tmpb,maxlen-lenb);
67 innum2(an,a,lena,tmpa,0);
68 jian(cn,bn);
69 if(cmp(cn,an)){
70 pushans(cn[0]-lena-tmpa,maxlen-lenb-tmpb,maxlen-lenc-tmpc);return ;
71 }
72 memset(cn,0,sizeof cn);
73 innum2(cn,c,lenc,tmpc,maxlen-lenc+1);
74 jian(cn,bn);
75 if(cmp(cn,an)){
76 pushans(cn[0]-lena-tmpa,maxlen-lenb-tmpb,maxlen-lenc+1-tmpc);return ;
77 }
78 }
79 int main()
80 {
81 int t;
82 scanf("%d",&t);
83 while(t--){
84 tmpa=tmpb=tmpc=0;
85 flag=0;
86 scanf("%s%s%s",a,b,c);
87 lena=strlen(a),lenb=strlen(b),lenc=strlen(c);
88 maxlen=maxme(lena,lenb,lenc);
89 while(a[lena-1]==48)tmpa++,lena--;
90 while(b[lenb-1]==48)tmpb++,lenb--;
91 while(c[lenc-1]==48)tmpc++,lenc--;
92 work();
93
94 if(flag){
95 printf("%d %d %d\n",ansa,ansb,ansc);
96 }
97 else
98 printf("-1\n");
99 }
100 return 0;
101 }
10x+b⋅10y