【每天一道算法题】(C语言参考解法)给定参数n,从1到n会有n个整数1,2,3,...,n这n个数组共有n!种排列,按照大小顺序升序排列出所有列的情况,并一一标记,给定n和k返回第k个值

本题为某厂机试题(本人亲历,未答出T_T),

参考声明

本文涉及到的代码重点参考:https://blog.csdn.net/umbrellalalalala/article/details/79792451

重点考察:

             **全排列**

核心算法:

枚举法,C的具体实现——通过迭代的方式,循环调用。

代码

需要细细品,思路还得再理理,晚些时候有新的理解再写。直接贴代码:

#include <stdio.h>
#include <stdlib.h>

int cur = 0;
long int j = 0;
#define MAX  9
int a[MAX] = {0};
//#define MAX_CNT 9*8*7*6*5*4*3*2*1
//char array[MAX_CNT*9];
void list_all_array(int n, char *full_array, int cur)
{    	
    if(cur == n) 
    {
        //printf("arrar addr is 0x%x\n", full_array);
        for(int i = 0; i < n; i++)
        {
            sprintf(full_array + j + i, "%d", a[i]);
            printf("%c", full_array[j+i]);
        }
        j += n;
        printf("\n");
    }
    else
    {
        for(int i = 1; i <= n; i++)
        {
            int ok = 1;
            for(int k = 0 ; k < cur; k++)
                if(a[k] == i)
                {
                   ok = 0;
                   break;
                }
            if(ok)
            {
                a[cur] = i;
                //printf("\t%s : j = %d\n\n", __func__, j);                         
                list_all_array(n, full_array, cur+1);
             }
        }
    }
}   


int main()
{    
    int n = 0;
    long int k = 0;
    long int k_value = 1;           
    int i = 0;
retry1:    
    printf("input n :");     
    scanf("%d", &n);
    if(n < 1 || n > 9)
    {        
        printf("please retry!\n");        
        goto retry1;    
    }
    for(i = n; i > 0; i--)
    {        
        k_value *= i;
    }
    printf("%d! is %ld\n", n, k_value);
retry2:
    printf("input k :");    
    scanf("%ld", &k);
    if(k < 1 || k > k_value)
    {    
        printf("please retry k!\n");    
        goto retry2;
    }
    char *array = (char *)malloc(sizeof(char) * k_value * n);
    list_all_array(n, array, 0);
    printf("result is :\n");
    for(int m = 0; m < n; m++)
    {
        printf("%c", array[(k - 1) * n + m] );
    }       
    printf("\n");
    free(array);
    return 0;
}

代码2020.7.15更新:
考虑到list_all_array中用到的数组a[MAX]为全局变量,可不作为输入形参,故删去了void list_all_array(int n, char* mid_array, char *full_array, int cur)中的char* mid_array这一输入形参。
最本质的思想还是通过递归调用list_all_array函数实现全排列枚举。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值