全排列的编码与解码

#include<cstdio>  
const int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};///阶乘  
  
int KT(int s[], int n)  
{  
    int i, j, cnt, sum;  
    sum = 0;  
    for (i = 0; i < n; ++i)  
    {  
        cnt = 0;  
        for (j = i + 1; j < n; ++j)  
            if (s[j] < s[i]) ++cnt;  
        sum += cnt * fac[n - i - 1];  
    }  
    return sum;  
}  
  
int main()  
{  
    int a[] = {3, 5, 7, 4, 1, 2, 9, 6, 8};  
    printf("%d\n", 1 + KT(a, sizeof(a) / sizeof(*a))); ///1+98884  
}  
#include<cstdio>  
#include<cstring>  
const int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};///阶乘  
  
bool vis[10];  
  
///n为ans大小,k为全排列的编码  
void invKT(int ans[], int n, int k)  
{  
    int i, j, t;  
    memset(vis, 0, sizeof(vis));  
    --k;  
    for (i = 0; i < n; ++i)  
    {  
        t = k / fac[n - i - 1];  
        for (j = 1; j <= n; j++)  
            if (!vis[j])  
            {  
                if (t == 0) break;  
                --t;  
            }  
        ans[i] = j, vis[j] = true;  
        k %= fac[n - i - 1];///余数  
    }  
}  
  
int main()  
{  
    int a[10];  
    invKT(a, 5, 16);  
    for (int i = 0; i < 5; ++i)  
        printf("%d ", a[i]);///1 4 3 5 2  
}  

地址:http://www.2cto.com/kf/201311/260148.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值