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