题意:
给出一串合法的数字('0' - '9',没有重复的),
给出一个数(只包含'0' - '9'),问这个数是否合法,如果合法,输出在合法数字下的这个数字的下一个数。
合法:没有前置0(0不合法),所有数字都在合法数字内。
思路:
先判断是否合法,如果合法,从后往前找到第一个不是最大的数的位置。
如果找到了这样的位置(即不是所有的数字都是最大的)
将这个位置增大1(在合法数字内),这个位置之后的所有数字全都变成合法数字中最小的。
否则,
增加一位,将最高位设为合法数字中最小的非零数字,剩下所有位置都变成合法数字中最小的。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int i, j;
char l[12], c[12], ll, lc;
bool flag;
int main()
{
while (~scanf("%s %s", l, c))
{
flag = true;
ll = strlen(l);
lc = strlen(c);
sort(l, l+ll);
if (c[0] == '0') flag = false;
for (i = 0; i < lc; ++ i)
{
for (j = 0; j < ll; ++ j)
if (c[i] == l[j]) break;
if (j == ll)
{
flag = false;
break;
}
}
if (flag)
{
for (i = lc-1; i >= 0; -- i)
if (c[i] != l[ll-1]) break;
if (i == -1)
{
for (j = 0; j < lc; ++ j) c[j] = l[0];
printf("%c%s\n", l[0]=='0'?l[1]:l[0], c);
}
else
{
for (j = 0; j < ll; ++ j)
if (l[j] == c[i]) break;
c[i] = l[j+1];
while (++ i < lc) c[i] = l[0];
printf("%s\n", c);
}
}
else printf("INVALID INPUT\n");
}
}