以279134399742为例
第一步找到末尾的上升序列99742 它的前一个数3就是要变换的数
第二部在上升序列99742中找到第一个比3大的数 也就是4 然后交换3和4
交换3和4后变为
279134499732
将99732逆序得279134423799
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#define ENTER printf("\n");
#define MOD 1000000007
//快速打印一个数组
#define ll long long
#define NUM 1000
using namespace std;
//构造函数 析构函数怎么打印出地址
int t, n;
char str[80+1];
int main()
{
scanf("%d", &t);
for (int i = 1; i <= t; i++)
{
scanf("%d%s", &n, str);
int len = strlen(str);
int j = len - 1;
while (str[j - 1] >= str[j]&&j>0)
j--;
if (j == 0)
{
printf("%d BIGGEST\n", n);
continue;
}
int k = j - 1;
//printf("第一个下降的数为%c\n", str[k]);
j = len - 1;
while (str[j] <= str[k])
j--;
//printf("上升序列中第一个比上述数大的数为%c\n", str[j]);
char temp = str[k];
str[k] = str[j];
str[j] = temp;
k++;
j = len - 1;
while (k < j)
{
temp = str[k];
str[k] = str[j];
str[j] = temp;
k++;
j--;
}
//printf("结果为");
printf("%d %s\n",n, str);
}
return 0;
}
然后发现STL里有现成得函数next_permutation…
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#define ENTER printf("\n");
#define MOD 1000000007
//快速打印一个数组
#define ll long long
#define NUM 1000
using namespace std;
//构造函数 析构函数怎么打印出地址
int t, n;
char str[80+1];
int main()
{
scanf("%d", &t);
for (int i = 1; i <= t; i++)
{
scanf("%d%s", &n, str);
int len = strlen(str);
if (next_permutation(str, str + len))
printf("%d %s\n", n, str);
else
printf("%d BIGGEST\n",n);
}
return 0;
}