1、我刚开始以为数字最大是10的6次方,没想到其实是数字的个数。
2、首先统计每个数字出现的个数,对于第一个数,要特判,A和B中不能有任何一个为0.
3、后面的就随意了,注意,可能所有数字都是0,这时不能输出前导零,只要用一个判断flag的语句即可实现。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char A[1000010],B[1000010];
int num1[10],num2[10];
int main(){
int T;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++){
scanf("%s%s",A,B);
printf("Case #%d: ",kase);
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
int len=strlen(A);
for(int i=0;i<len;i++){
num1[A[i]-'0']++;
num2[B[i]-'0']++;
}
bool flag=false;
for(int M=9;M>=1;M--){
for(int i=1;i<=9;i++){
if(num1[i]>0){
int temp1=M-i;
if(temp1>0&&temp1<=9&&num2[temp1]>0){
printf("%c",M+'0');
num1[i]--;num2[temp1]--;
flag=true;
}
if(flag) break;
int temp2=10+M-i;
if(temp2>0&&temp2<=9&&num2[temp2]>0){
printf("%c",M+'0');
num1[i]--;num2[temp2]--;
flag=true;
}
if(flag) break;
}
}
if(flag) break;
}
if(!flag) {printf("0\n");continue;}
for(int M=9;M>=0;M--){
for(int i=0;i<=9;i++){
if(num1[i]>0){
int temp1=M-i;
if(temp1>=0 && temp1<=9 && num2[temp1]>0){
int m=min(num1[i],num2[temp1]);
num1[i]-=m;num2[temp1]-=m;
for(int k=0;k<m;k++)
printf("%c",'0'+M);
}
int temp2=10+M-i;
if(temp2>=0 && temp2<=9 && num2[temp2]>0){
int m=min(num1[i],num2[temp2]);
num1[i]-=m;num2[temp2]-=m;
for(int k=0;k<m;k++)
printf("%c",'0'+M);
}
}
}
}
printf("\n");
}
return 0;
}