Kia's Calculation

本文介绍了一个有趣的算法问题,即如何通过重新排列两个整数的数字来获得它们相加后的最大可能和,同时确保首位不为零。文章提供了一段C++代码实现,该算法考虑了数字的重新组合以得到最大的可能之和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值