输入一个长度大于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;
}