Kia's Calculation

来源:互联网 发布:java线程池实现 编辑:程序博客网 时间:2024/04/25 13:05

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 99. For example, when she calculates 4567+57894567+5789, she will get 92469246, and for 1234+98761234+9876, she will get 00. Ghee is angry about this, and makes a hard problem for her to solve:

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

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

Input

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

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

Both AA and BB will have same number of digits, which is no larger than 106106, and without leading zeros.

Output

For test case XX, 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;
}

0 0
原创粉丝点击