Kia's Calculation

Doctor Ghee is teaching Kia how to calculate the sum of two integers. But Kia is so careless and alway forget to carry a number when the sum of two digits exceeds  9 9. For example, when she calculates  4567+5789 4567+5789, she will get  9246 9246, and for  1234+9876 1234+9876, she will get  0 0. Ghee is angry about this, and makes a hard problem for her to solve:

Now Kia has two integers  A A and  B B, she can shuffle the digits in each number as she like, but leading zeros are not allowed. That is to say, for  A=11024 A=11024, she can rearrange the number as  10124 10124, or  41102 41102, or many other, but  02411 02411 is not allowed.

After she shuffles  A A and  B B, she will add them together, in her own way. And what will be the maximum possible sum of  A A +  B B?

Input

The first line has a number  T T ( T25 T≤25) , indicating the number of test cases.

For each test case there are two lines. First line has the number  A A, and the second line has the number  B B.

Both  A A and  B B will have same number of digits, which is no larger than  106 106, and without leading zeros.

Output

For test case  X X, output Case #X: first, then output the maximum possible sum without leading zeros.

Sample Input


5958 
3036

Sample Output

Case #1: 8984



#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=2000010;
int num1[N],num2[N];
int sum[N];
int a[20],b[20];
string s,s1;
int main()
{
    int  t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        cin>>s>>s1;
        int l=s.length();
         for(int j=0;j<l;j++)
        {
            num1[j]=s[j]-'0';
            num2[j]=s1[j]-'0';
        }
        if(l==1)
        {
            printf("Case #%d: %d\n",i,(num1[0]+num2[0])%10);
            continue;
        }
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int j=0;j<l;j++)
        {
            a[num1[j]]++;
            b[num2[j]]++;
        }
        int x=0,y=0;
        int tt=-1;
        for(int j=1;j<=9;j++)//最高位
            for(int k=1;k<=9;k++)
            if(a[j]&&b[k]&&((j+k)%10)>tt)
        {
            x=j;y=k;tt=(x+y)%10;
        }
        a[x]--;b[y]--;
        int cnt=0;
        sum[cnt++]=(x+y)%10;
        for(int j=9;j>=0;j--)//下
            for(int k=0;k<=9;k++)//上
        {
            if(a[k])
            {
                if(k<=j)//先找大的从9开始
                {
                    int flag=j-k;
                    int sign=min(a[k],b[flag]);//计数最少的选
                    a[k]-=sign;
                    b[flag]-=sign;
                    while(sign--)
                        sum[cnt++]=j;
                }
                int flag=10+j-k;
                if(flag>9) continue;
                //j<k时的结果
                int sign=min(a[k],b[flag]);
                a[k]-=sign;
                b[flag]-=sign;
                while(sign--)
                    sum[cnt++]=j;
            }
        }
        printf("Case #%d: ",i);
        int ss=0;
        while(ss<cnt-1&&sum[ss]==0) ss++;//剔除最高位为0;例如000时
        for(int j=ss;j<cnt;j++)
            printf("%d",sum[j]);
        cout<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值