Kia's Calculation UESTC - 836

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

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


题意:给你两个整数,然后你可以对每一位随意的调换变成一个新的数,之后两个数相加,注意这里相加是不进位的相加,让你求出最大能得出来的数。

做了将近半天了吧,最终得出了最终思路,事实上这套数据比较水,发现55+50这种情况它并没有。不过最终的版本是考虑到这种情况了的。

思路:

读进来两个数之后,先统计每个数,各个位上的数字个数。比如5958就有两个5,一个9,一个8.

首先就是找到加和的第一位,贪心的从9找到0,找的时候注意对于相加的两个数是不找0的,因为不允许存在前导0这种情况。然后记录一下最终找的第一位是不是0。

之后再去寻找其他位的加和数,这时候找的时候也是贪心的从9找到0,因为0需要特判,我们先从9找到1。找的时候相加的两个数是找0的。

之后就是判断最后0的这种情况了。

1.如果第一位不为0,那么直接找0输出就可以了。

2.如果第一位为0,但是后面的位数有不为0的,那么最后的0也是可以直接输出就可以了。

3.如果第一位为0,后面也找不到位数不为0的,那么最后只输出一个0。

4.在找第一位的时候,如果是0则不输出的。

具体的看下代码就懂了。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN=1e6+7;char s[MAXN];int num1[20],num2[20];bool flag[20];int ans[20];int main(){    int t,ca=0;    scanf("%d",&t);    while(t--)    {        int i,j,k,l;        memset(num1,0,sizeof(num1));        memset(num2,0,sizeof(num2));        memset(ans,0,sizeof(ans));        memset(flag,0,sizeof(flag));        scanf("%s",s);        l=strlen(s);        int knum1,knum2;        knum1=s[0]-'0';        for(i=0; i<l; ++i)        {            num1[s[i]-'0']++;        }        scanf("%s",s);        knum2=s[0]-'0';        for(i=0; i<l; ++i)        {            num2[s[i]-'0']++;        }        printf("Case #%d: ",++ca);        if(l==1)printf("%d\n",(knum1+knum2)%10);        else        {            int flag=0;            int f1=0;            for(k=9; k>=0; --k)if(!flag)                    for(i=1; i<=9; ++i)if(!flag)                            for(j=1; j<=9; ++j)                            {                                if((i+j)%10==k&&num1[i]&&num2[j])                                {                                    num1[i]--;                                    num2[j]--;                                    if(k)                                    {                                        f1=1;                                        printf("%d",k);                                    }                                    flag=1;                                    break;                                }                            }                for(k=9; k>=0; --k)                    for(i=0; i<10; ++i)                        for(j=0; j<10; ++j)                        {                            if((i+j)%10==k&&num1[i]&&num2[j])                            {                                int p=min(num1[i],num2[j]);                                ans[k]+=p;                                num1[i]-=p;                                num2[j]-=p;                            }                        }                        int f2=0;                for(i=9; i>=1; --i)                    {                        for(j=0; j<ans[i]; ++j)                        {                            f2=1;                            printf("%d",i);                        }                    }                    if(f1)for(j=0; j<ans[0]; ++j)printf("0");                    else                    {                        if(f2)for(j=0; j<ans[0]; ++j)printf("0");                        else printf("0");                    }                puts("");        }    }    return 0;}


1 0
原创粉丝点击