问:如果用户输入为183,则输出应为183138138813831318381。
答:此解决方案一定会对您有所帮助,它将生成给定数字的所有排列而无需重复。实际上,它将在输入数字后进一步生成数字,如果需要所有排列,请删除排序函数调用的注释。在下面的实现中,要做的是将数字分解为单位数字并保存到数组中。在此之后,我们寻找找到值较小的任何元素,然后从上一个索引元素遍历到下一个索引元素。如果在该索引处找到了任何匹配的元素,则将其替换为从索引+1到数组长度在数组上侧具有较大值的元素。将数组的上侧从索引+ 1交换到数组的长度后,必须按递增顺序进行排序。重复此步骤,直到没有任何可能性为止。
#include <stdio.h>
可能的int(int arr [],int n)
{
我
对于(i = n-1; i> 0; i--)
如果(arr [i]> arr [i-1])
返回1;
返回0;
}
void print(int arr [],int n)
{
我
对于(i = 0; i <n; i ++)
printf(“%d”,arr [i]);
printf(“ \ n”);
}
void swap(int * a,int * b)
{
int t = * a;
* a = * b;
* b = t;
}
整数分区(整数arr [],整数低,整数高)
{
intivot = arr [high];
int i =(低-1);
int j;
对于(j =低; j <=高-1; j ++)
{
如果(arr [j] <=枢轴)
{
i ++;
swap(&arr [i],&arr [j]);
}
}
swap(&arr [i +1],&arr [high]);
返回(i + 1);
}
void quickSort(int arr [],int低,int高)
{
如果(低<高)
{
int pi = partition(arr,low,high);
quickSort(arr,low,pi-1);
quickSort(arr,pi + 1,高);
}
}
void nextNumber(int arr [],int n)
{
int i,j;
int currentMin = 1000000;
整数索引
温度
对于(i = n-1; i> 0; i--){
如果(arr [i]> arr [i-1]){
对于(j = i; j <n; j ++){
如果(arr [i-1] <arr [j] && currentMin> arr [j]){
currentMin = arr [j];
索引= j;
}
}
temp = arr [i-1];
arr [i-1] = arr [index];
arr [index] = temp;
quickSort(arr,i,n-1);
打破;
}
}
返回;
}
int main()
{
整数
int tmp;
int len = 0;
我
scanf(“%d”,&num);
tmp = num;
while(tmp){
tmp / = 10;
len ++;
}
int arr [len];
对于(i = len-1; i> = 0; i--){
arr [i] = num%10;
num / = 10;
}
// quickSort(arr,0,len-1); //删除此评论以生成所有可能性
while(1){
打印(arr,len);
if(possible(arr,len)){
nextNumber(arr,len);
}其他{
printf(“没有其他可能性\ n”);
打破;
}
}
返回0;
}