MCLONUM - Closest Number

Tác giả: hieult

Ngôn ngữ: C++

#include <cstdio>
#include <cstring>
//#include <conio.h>

char s[66];

char* max(int A[])
{
    int b[12],t=0;
    for(int i = 0;i<=9;i++) b[i] = A[i];
    for(int i = 9;i>=0;i--)
    {
         for(int j = t;j<b[i]+t;j++)
              s[j] = i+48;
         t+=b[i];
    }
    s[t] = '\0';
   // printf("");
    return s;
}

char* minc(int A[])
{
    int b[12],t=0;
    for(int i = 0;i<=9;i++) b[i] = A[i];
    for(int i = 1;i<=9;i++)
        if(b[i]>0)
        {
            s[0] = i+48;
            b[i]--;
            t++;
            break;
        }
    for(int i = 0;i<=9;i++)
    {
         for(int j = t;j<b[i]+t;j++)
              s[j] = i+48;
         t+=b[i];
    }
    s[t] = '\0';
   // printf("");
    return s;
}

char* min(int A[])
{
    int b[12],t=0;
    for(int i = 0;i<=9;i++) b[i] = A[i];
    for(int i = 0;i<=9;i++)
    {
         for(int j = t;j<b[i]+t;j++)
              s[j] = i+48;
         t+=b[i];
    }
    s[t] = '\0';
   // printf("");
    return s;
}

int main()
{
    //freopen("MCLONUM.in","r",stdin);
    //printf("%d\n",'0');
    int a[12],n,t[12],a1[12];;
    char s1[66],s2[66],st[66],s1the[66];
    scanf("%s %s",s1,s2);
    strcpy(s1the,s1);
    n = strlen(s2);
    for(int i = 0;i<10;i++) a[i] = 0;
    for(int i = 0;i<n;i++)
        a[s2[i]-48]++;
    for(int i = 0;i<10;i++) a1[i] = a[i];
    if(strlen(s2)>strlen(s1))
        printf("%s\n0\n",minc(a));
    else if(strlen(s2)<strlen(s1))
         printf("0\n%s\n",max(a));
    else
    {
    if(strcmp(max(a),s1)<0)
         printf("0");
    else
    {
        while(true)
        {
            int flag = 0;
            for(int i = 0;i<10;i++)
                if(a[i]>0)
                {
                    flag = 1;
                    break;
                }
            if(!flag) break;
            strncpy(st,s1+1,strlen(s1));
            for(int i = 0;i<10;i++) t[i] = a[i];
            t[s1[0]-48]--;
            if(a[s1[0]-48]==0 || strcmp(max(t),st)<0)
            {
                 for(int i = s1[0]-48+1;i<10;i++)
                      if(a[i]>0)
                      {
                           printf("%c",i+48);
                           a[i]--;
                           printf("%s",min(a));
                           break;
                      }
                 break;
            }
            else
            {
                 printf("%c",s1[0]);
                 a[s1[0]-48]--;
                 strcpy(s1,st);
            }
        }
    }
    strcpy(s1,s1the);
    for(int i = 0;i<10;i++) { a[i] = a1[i];}
    printf("\n");
    if(strcmp(minc(a),s1)>=0)
         printf("0");
    else
    {
        while(true)
        {
            int flag = 0;
            for(int i = 0;i<10;i++)
                if(a[i]>0)
                {
                    flag = 1;
                    break;
                }
            if(!flag) break;
            strncpy(st,s1+1,strlen(s1));
            for(int i = 0;i<10;i++) t[i] = a[i];
            t[s1[0]-48]--;
            if(a[s1[0]-48]==0 || strcmp(min(t),st)>=0)
            {
                 for(int i = s1[0]-48-1;i>=0;i--)
                      if(a[i]>0)
                      {
                           printf("%c",i+48);
                           a[i]--;
                           printf("%s",max(a));
                           break;
                      }
                 break;
            }
            else
            {
                 printf("%c",s1[0]);
                 a[s1[0]-48]--;
                 strcpy(s1,st);
            }
        }
    }
    printf("\n");
    }
    
   // getch();    
    
}

Download