[hud-6646]A+B=C 高精度 大数思维 2019多校7

题目链接: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+b10y=c10

posted @ 2019-08-16 12:07  conver^_^  阅读(301)  评论(0编辑  收藏  举报