输入一个长度大于10位的自然数,输出将其各位数字重新排列成的比原数小的 最大数。

输入一个长度大于10位的自然数,输出将其各位数字重新排列成的比原数小的
最大数。

从右向左逐位数字比较,找到第一对递增的数对,然后先交换两个数,再把已经比较过的非递增序列按降序排列即可
比如1435678,从右向左找到3和4为递增,那么首先3和4交换,得到1345678,然后再将比较过的45678降序排列,从而得到1387654为符合条件的最小数

思路很简单,从右往左,两两比较,找到第一组左边的数比右边的大的情况,交换两个值就行。如果没找到则代表无解。用数组保存数据会方便一些。因为数值过大可能long long int也无法保存。

#include <stdio.h>
#include <string.h>
int main() {
    char arr[1024] = {};
    scanf("%s", &arr);
    int size = strlen(arr);
    while (size > 1) {
        if (arr[size - 2] > arr[size - 1]) {
            char c = arr[size - 2];
            arr[size - 2] = arr[size - 1];
            arr[size - 1] = c;
            printf("%s", arr);
            return 0;
        }
        size--;
    }
    printf("无解\n");
    return 0;
}